将一个项添加到IEnumerable <t>的最佳方法是什么?</t>

时间:2013-03-06 15:19:54

标签: c# extension-methods ienumerable

以下是我将如何向IEnumerable对象添加一个项目:

//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };

//Add one item
arr = arr.Concat(new string[] { "JKL" });

这很尴尬。我没有看到类似ConcatSingle()之类的方法。

是否有更简洁的方法将单个项添加到IEnumerable对象?

6 个答案:

答案 0 :(得分:16)

不,这与您使用内置语言/框架功能一样简洁。

如果您愿意,可以随时创建扩展方法:

arr = arr.Append("JKL");
// or
arr = arr.Append("123", "456");
// or
arr = arr.Append("MNO", "PQR", "STU", "VWY", "etc", "...");

// ...

public static class EnumerableExtensions
{
    public static IEnumerable<T> Append<T>(
        this IEnumerable<T> source, params T[] tail)
    {
        return source.Concat(tail);
    }
}

答案 1 :(得分:8)

IEnumerable不可变的集合,这意味着您无法添加或删除项目。相反,您必须为此创建一个新集合,只需转换为要添加的列表:

var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added

答案 2 :(得分:7)

编写扩展方法ConcatSingle:)

public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> source, T item)
{
    return source.Concat(new [] { item } );
}

但是你需要更加小心你的术语 您无法将项目添加到IEnumerable<T>Concat创建了一个新实例。

示例:

var items = Enumerable.Range<int>(1, 10)
Console.WriteLine(items.Count()); // 10
var original= items;
items = items.ConcatSingle(11);
Console.WriteLine(original.Count());   // 10
Console.WriteLine(items.Count()); // 11

正如您所看到的,我们在original中保存的原始枚举没有改变。

答案 3 :(得分:6)

由于IEnumerable是只读的,因此您需要转换为列表。

var new_one = arr.ToList().Add("JKL");

或者您可以获得 extension method 之类的;

public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
    return source.Concat(item);
}

答案 4 :(得分:3)

Append()-正是您所需要的,它已添加到.NET Standard(在2017年),因此您不再需要编写自己的扩展方法。您可以简单地做到这一点:

arr = arr.Append("JKL");

由于.NET是开源的,因此您可以在此处查看实现(它比上面建议的自定义方法更为复杂): https://github.com/dotnet/runtime/blob/master/src/libraries/System.Linq/src/System/Linq/AppendPrepend.cs

答案 5 :(得分:2)

您正在为IEnumerable分配一个数组。为什么不使用Array类型而不是IEnumerable?

否则,如果要更改集合,可以使用IList(或List)。

当我需要读取时,IEnumerable仅用于方法params,当我需要更改其中的项目时,我使用IList(或List)。