Ответ 1
Один из вариантов заключается в том, чтобы перегрузить его самостоятельно:
public static IEnumerable<T> Union<T>(this IEnumerable<T> source, T item)
{
return source.Union(Enumerable.Repeat(item, 1));
}
Если у меня есть две последовательности, и я хочу обрабатывать их вместе, я могу объединить их, и мы уходим.
Теперь скажем, что у меня есть один элемент, который я хочу обработать между двумя секвенциями. Я могу получить его, создав массив с одним элементом, но есть ли более аккуратный способ? то есть.
var top = new string[] { "Crusty bread", "Mayonnaise" };
string filling = "BTL";
var bottom = new string[] { "Mayonnaise", "Crusty bread" };
// Will not compile, filling is a string, therefore is not Enumerable
//var sandwich = top.Union(filling).Union(bottom);
// Compiles and works, but feels grungy (looks like it might be smelly)
var sandwich = top.Union(new string[]{filling}).Union(bottom);
foreach (var item in sandwich)
Process(item);
Есть ли одобренный способ сделать это, или это одобренный способ?
Спасибо
Один из вариантов заключается в том, чтобы перегрузить его самостоятельно:
public static IEnumerable<T> Union<T>(this IEnumerable<T> source, T item)
{
return source.Union(Enumerable.Repeat(item, 1));
}
Рассмотрим более гибкий подход:
public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items)
{
return source.Union((IEnumerable<T>)items);
}
Работает как для одного, так и для нескольких элементов.
Вы также можете принимать значения null source
:
public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items)
{
return source != null ? source.Union((IEnumerable<T>)items) : items;
}
В моем коде есть, как правило, следующее:
public static IEnumerable<T> EmitFromEnum(this T item)
{
yield return item;
}
Хотя это не так просто назвать col.Union(obj.EmitFromEnum());
как col.Union(obj)
, это означает, что этот единственный метод расширения охватывает все другие случаи, которые могут потребоваться для перечисления одного элемента.