Лучшие методы-расширения по версии StackOverflow
Предыдущая статья по поводу типичных ошибок .NET программистов вызвала некоторый интерес, поэтому предлагаю вашему вниманию еще одну заметку - список лучших методов расширений по версии сайта StackOverflow.
На первом месте расположились методы-расширения из библиотеки MiscUtil, в частности методы для работы с датами и временем (автор предлагает их использовать для модульного тестирования, но не для продакшна):
<code>var birthday = 19.June(1976);<br />var workingDay = 7.Hours() + 30.Minutes();<br /></code>
<code>var evenNaturals = 2.To(int.MaxValue).Step(2);<br />var daysSinceBirth = birthday.To(DateTime.Today).Step(1.Days());<br /></code>
Сравнения:
<code>var myComparer = ProjectionComparer.Create(Person p => p.Name);<br />var next = myComparer.ThenBy(p => p.Age);<br />var reversed = myComparer.Reverse();<br /></code>
Проверка значений - если null, то бросаем ArgumentNullException:
<code>x.ThrowIfNull("x");<br /></code>
Далее в списку расположился метод, который инкапсулирует логику поиска элемента в некой коллекции объектов:
<code>public static bool In<T>(this T source, params T[] list)<br />{<br /> if(null==source) throw new ArgumentNullException("source");<br /> return list.Contains(source);<br />}<br /></code>
Что позволяет вместо такого кода:
<code>if(reallyLongIntegerVariableName == 1 || <br /> reallyLongIntegerVariableName == 6 || <br /> reallyLongIntegerVariableName == 9 || <br /> reallyLongIntegerVariableName == 11)<br />{<br /> // do something....<br />}<br /><br />и<br /><br />if(reallyLongStringVariableName == "string1" || <br /> reallyLongStringVariableName == "string2" || <br /> reallyLongStringVariableName == "string3")<br />{<br /> // do something....<br />}<br /><br />и<br /><br />if(reallyLongMethodParameterName == SomeEnum.Value1 || <br /> reallyLongMethodParameterName == SomeEnum.Value2 || <br /> reallyLongMethodParameterName == SomeEnum.Value3 || <br /> reallyLongMethodParameterName == SomeEnum.Value4)<br />{<br /> // do something....<br />}<br /></code>
писать просто
<code>if(reallyLongIntegerVariableName.In(1,6,9,11))<br />{<br /> // do something....<br />}<br /><br />и<br /><br />if(reallyLongStringVariableName.In("string1","string2","string3"))<br />{<br /> // do something....<br />}<br /><br />и<br /><br />if(reallyLongMethodParameterName.In(SomeEnum.Value1, SomeEnum.Value2, SomeEnum.Value3, SomeEnum.Value4)<br />{<br /> // do something....<br />}<br /></code>
Хотя с таким же успехом, как подсказали в комментариях, можно использовать такой код:
(new[] { 1, 2, 3 }).Contains(a)
Сокращенная форма вызова метода string.Format() расположилась на одной ступени ниже:
<code>public static class StringExtensions<br />{<br /> // Enable quick and more natural string.Format calls<br /> public static string F(this string s, params object[] args)<br /> {<br /> return string.Format(s, args);<br /> }<br />}<br /></code>
Пример использования:
<code>var s = "The co-ordinate is ({0}, {1})".F(point.X, point.Y);<br /></code>
Полезный метод-расширения Between:
<code>public static class ComparableExtensions<br />{<br /> public static bool Between<T>(this T actual, T lower, T upper) where T : IComparable<T><br /> {<br /> return actual.CompareTo(lower) >= 0 && actual.CompareTo(upper) < 0;<br /> }<br />}<br /></code>
Пример:
<code>if (myNumber.Between(3,7))<br />{<br /> // ....<br />}<br /></code>
Дальше не менее полезная и понятная функция "один из":
<code>public static T OneOf<T>(this Random rng, params T[] things)<br />{<br /> return things[rng.Next(things.Length)];<br />}<br /></code>
Пример использования:
<code>Random rand;<br />bool luckyDay = rand.CoinToss();<br />string babyName = rand.OneOf("John", "George", "Radio XBR74 ROCKS!");<br /></code>
Следующим в списке идет ForEach для IEnumerables:
<code>public static class FrameworkExtensions<br />{<br /> // a map function<br /> public static void ForEach<T>(this IEnumerable<T> @enum, Action<T> mapFunction)<br /> {<br /> foreach (var item in @enum) mapFunction(item);<br /> }<br />}<br /></code>
Пример использования:
<code>var buttons = GetListOfButtons() as IEnumerable<Button>;<br /><br />// click all buttons<br />buttons.ForEach(b => b.Click());<br /></code>
Прикольный пример:
<code>// no need to type the same assignment 3 times, just<br />// new[] up an array and use foreach + lambda<br />// everything is properly inferred by csc :-)<br />new { itemA, itemB, itemC }<br /> .ForEach(item => {<br /> item.Number = 1;<br /> item.Str = "Hello World!";<br /> });<br /></code>
С остальными примерами можно ознакомиться по ссылке.
Все методы-расширения оформлены в виде библиотеки ExctensionOverflow и доступны по ссылке: http://extensionoverflow.codeplex.com/
А какие методы-расширения вы часто используете в своих приложениях?