Лучшие методы-расширения по версии StackOverflow

вторник, 9 ноября 2010, Александр Краковецкий

Предыдущая статья по поводу типичных ошибок .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/

А какие методы-расширения вы часто используете в своих приложениях?


Ищите нас в интернетах!

Комментарии

Свежие вакансии