Подтвердить что ты не робот

Есть ли более простой способ linux для "Объединения" одного элемента?

Если у меня есть две последовательности, и я хочу обрабатывать их вместе, я могу объединить их, и мы уходим.

Теперь скажем, что у меня есть один элемент, который я хочу обработать между двумя секвенциями. Я могу получить его, создав массив с одним элементом, но есть ли более аккуратный способ? то есть.

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);

Есть ли одобренный способ сделать это, или это одобренный способ?

Спасибо

4b9b3361

Ответ 1

Один из вариантов заключается в том, чтобы перегрузить его самостоятельно:

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, T item)
{
    return source.Union(Enumerable.Repeat(item, 1));
}

Что мы сделали с Concat в MoreLINQ.

Ответ 2

Рассмотрим более гибкий подход:

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;
}

Ответ 3

В моем коде есть, как правило, следующее:

public static IEnumerable<T> EmitFromEnum(this T item)
{
  yield return item;
}

Хотя это не так просто назвать col.Union(obj.EmitFromEnum()); как col.Union(obj), это означает, что этот единственный метод расширения охватывает все другие случаи, которые могут потребоваться для перечисления одного элемента.