Gab*_*art 9 c# linq ienumerable
我需要在IEnumerable之前添加一个值(在本例中IEnumerable<string[]>).为了做到这一点,我正在创建一个List<T>just来包装第一个值,以便我可以调用Concat:
// get headers and data together
IEnumerable<string[]> headers = new List<string[]> {
GetHeaders()
};
var all = headers.Concat(GetData());
Run Code Online (Sandbox Code Playgroud)
呸.有没有更好的办法?你会如何处理附加值的相反情况?
Gre*_*reg 23
我编写了自定义扩展方法来执行此操作:
public static IEnumerable<T> Append<T>(this IEnumerable<T> source, T item)
{
foreach (T i in source)
yield return i;
yield return item;
}
public static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T item)
{
yield return item;
foreach (T i in source)
yield return i;
}
Run Code Online (Sandbox Code Playgroud)
在您的场景中,您会写:
var all = GetData().Prepend(GetHeaders());
Run Code Online (Sandbox Code Playgroud)
正如chilltemp评论的那样,这不会改变原始集合.以真正的Linq方式,它产生了一个新的IEnumerable<T>.
注意:建议使用急切的空参数检查source,但为简洁起见未显示.
使用Enumerable.Concat扩展方法.要附加值而不是预先添加,您只需Concat反向调用.(即:GetData().Concat(GetHeaders());)
如果GetHeaders()返回单个字符串数组,我个人可能将它包装在单个元素数组而不是列表中:
var all = (new[] {GetHeaders()}).Concat(GetData());
Run Code Online (Sandbox Code Playgroud)