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
4 réponses
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;
}
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.
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);