有没有更整洁的linq方式来’联合’单项?
如果我有两个序列并且我想要将它们一起处理,我可以将它们联合起来然后我们去。
现在让我说我想在两个序列之间处理一个项目。 我可以通过创建一个包含单个项目的数组来获取它,但是有更简洁的方法吗? 即
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 Union (this IEnumerable source, T item) { return source.Union(Enumerable.Repeat(item, 1)); }
这就是我们在MoreLINQ中对Concat
所做的 。
考虑使用更灵活的方法:
public static IEnumerable Union (this IEnumerable source, params T[] items) { return source.Union((IEnumerable )items); }
适用于单个项目和多个项目。 您也可以接受空source
值:
public static IEnumerable Union (this IEnumerable source, params T[] items) { return source != null ? source.Union((IEnumerable )items) : items; }
我倾向于在我的代码中的某处:
public static IEnumerable EmitFromEnum (this T item) { yield return item; }
虽然调用col.Union(obj.EmitFromEnum());
并不是那么整洁col.Union(obj.EmitFromEnum());
作为col.Union(obj)
它确实意味着这个单一的扩展方法涵盖了我可能想要这样一个单项枚举的所有其他情况。
更新:使用.NET Core,您现在可以使用.Append()
或.Prepend()
将单个元素添加到可枚举中。 优化实现以避免在后台生成太多IEnumerator
实现。
从版本4.7.1开始,.NET Core和.NET Framework支持的新方法是使用Append
扩展方法。
这将使您的代码简单而优雅
var sandwich = top.Append(filling).Union(bottom);