有没有更简洁的linq方式来'联盟'单项?

Bin*_*ier 26 c# linq union

如果我有两个序列并且我想要将它们一起处理,我可以将它们联合起来然后我们去.

现在假设我有一个项目,我想在两个序列之间处理.我可以通过创建一个包含单个项目的数组来获取它,但是有更简洁的方法吗?即

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)

这就是我们ConcatMoreLINQ所做的.

  • 在编写C#代码时,我经常会发现自己渴望使用F#或LISP等语言设置操作运算符.一旦你习惯了它们,像`list :: item`或`list1 @ list2`这样的语法往往具有很强的可读性. (2认同)

Kęd*_*rzu 6

考虑使用更灵活的方法:

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)


Glo*_*del 6

.NET Core 和 .NET Framework 4.7.1 版支持的新方法是使用Append扩展方法。

这将使您的代码简单而优雅

var sandwich = top.Append(filling).Union(bottom);
Run Code Online (Sandbox Code Playgroud)


Jon*_*nna 5

我倾向于在我的代码中包含以下内容:

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该实现经过优化,以避免在幕后生成过多的实现。

  • `public static IEnumerable&lt;T&gt; EmitFromEnum&lt;T&gt;(this T item) { 产量返回项目; }` (2认同)