Y a-t-il un moyen plus propre de 'Union' un seul élément?

Si j'ai deux séquences et que je veux les traiter toutes les deux ensemble, je peux les unir et partir.

Maintenant, disons que j'ai un seul élément que je veux traiter entre les deux séquencs. Je peux l'obtenir en créant un tableau avec un seul élément, mais y a-t-il un moyen plus propre? c'est à dire

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

Y a-t-il une façon approuvée de le faire, ou est-ce la manière approuvée?

Merci

25
demandé sur Binary Worrier 2010-08-20 19:07:57

4 réponses

Une option est de le surcharger vous-même:

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

C'est ce que nous avons fait avec Concat dans MoreLINQ.

34
répondu Jon Skeet 2017-05-15 15:15:04

Envisagez d'utiliser une approche encore plus flexible:

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items)
{
    return source.Union((IEnumerable<T>)items);
}

Fonctionne pour les éléments simples et multiples. Vous pouvez également accepter les valeurs null source:

public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items)
{
    return source != null ? source.Union((IEnumerable<T>)items) : items;
}
5
répondu Kędrzu 2015-08-12 14:48:25

J'ai tendance à avoir ce qui suit quelque part dans mon code:

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

Bien qu'il ne soit pas aussi intéressant d'appeler col.Union(obj.EmitFromEnum()); que col.Union(obj), cela signifie que cette méthode d'extension unique couvre tous les autres cas, je pourrais vouloir une telle énumération à un seul élément.

Update: avec. net Core, vous pouvez maintenant utiliser .Append() ou .Prepend() pour ajouter un seul élément à un énumérable. L'implémentation est optimisée pour éviter de générer trop d'implémentations IEnumerator dans les coulisses.

2
répondu Jon Hanna 2018-04-30 15:31:25

La nouvelle façon de le faire, prise en charge dans. NET Core et. NET Framework à partir de la version 4.7.1, utilise le Append méthode d'extension.

Cela rendra votre code aussi simple et élégant que

var sandwich = top.Append(filling).Union(bottom);
1
répondu Glorfindel 2018-09-12 12:05:19