如果我有两个序列并且我想要将它们一起处理,我可以将它们联合起来然后我们去.
现在假设我有一个项目,我想在两个序列之间处理.我可以通过创建一个包含单个项目的数组来获取它,但是有更简洁的方法吗?即
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);
Run Code Online (Sandbox Code Playgroud)
是否有批准的方式,或者这是批准的方式?
谢谢
Jon*_*eet 36
一种选择是自己超载:
public static IEnumerable<T> Union<T>(this IEnumerable<T> source, T item)
{
return source.Union(Enumerable.Repeat(item, 1));
}
Run Code Online (Sandbox Code Playgroud)
考虑使用更灵活的方法:
public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items)
{
return source.Union((IEnumerable<T>)items);
}
Run Code Online (Sandbox Code Playgroud)
适用于单个项目和多个项目.您也可以接受空source
值:
public static IEnumerable<T> Union<T>(this IEnumerable<T> source, params T[] items)
{
return source != null ? source.Union((IEnumerable<T>)items) : items;
}
Run Code Online (Sandbox Code Playgroud)
.NET Core 和 .NET Framework 4.7.1 版支持的新方法是使用Append
扩展方法。
这将使您的代码简单而优雅
var sandwich = top.Append(filling).Union(bottom);
Run Code Online (Sandbox Code Playgroud)
我倾向于在我的代码中包含以下内容:
public static IEnumerable<T> EmitFromEnum<T>(this T item)
{
yield return item;
}
Run Code Online (Sandbox Code Playgroud)
虽然调用起来并不那么简洁,col.Union(obj.EmitFromEnum());
但col.Union(obj)
它确实意味着这个单一扩展方法涵盖了所有其他情况,但我可能需要这样一个单项枚举。
更新:使用 .NET Core,您现在可以使用.Append()
或.Prepend()
将单个元素添加到可枚举中。IEnumerator
该实现经过优化,以避免在幕后生成过多的实现。