我的问题如上所述。例如
IEnumerable<T> items = new T[]{new T("msg")};
items.ToList().Add(new T("msg2"));
但毕竟里面只有一项。我们能不能有一个items.Add(item)方法,比如List<T>?
我的问题如上所述。例如
IEnumerable<T> items = new T[]{new T("msg")};
items.ToList().Add(new T("msg2"));
但毕竟里面只有一项。我们能不能有一个items.Add(item)方法,比如List<T>?
当前回答
在.net Core中,有一个方法Enumerable。附加就是这样做的。
该方法的源代码可在GitHub.....上获得实现(比其他答案中的建议更复杂)值得一看:)。
其他回答
你可以做到的。
//Create IEnumerable
IEnumerable<T> items = new T[]{new T("msg")};
//Convert to list.
List<T> list = items.ToList();
//Add new item to list.
list.add(new T("msg2"));
//Cast list to IEnumerable
items = (IEnumerable<T>)items;
我只是想说,除了Enumerable。Concat扩展方法,似乎有另一个方法名为Enumerable。在. net Core 1.1.1中添加。后者允许您将单个项连接到现有序列。所以Aamol的答案也可以写成
IEnumerable<T> items = new T[]{new T("msg")};
items = items.Append(new T("msg2"));
不过,请注意,这个函数不会改变输入序列,它只是返回一个包装器,将给定的序列和附加的项放在一起。
您不仅不能像您的状态那样添加项,而且如果您将项添加到List<T>(或几乎任何其他非只读集合),并且您有一个现有的枚举器,则枚举器将失效(从那时开始抛出InvalidOperationException)。
如果您正在聚合来自某种类型的数据查询的结果,您可以使用Concat扩展方法:
编辑:我最初在示例中使用了Union扩展,这是不正确的。我的应用程序广泛地使用它来确保重叠的查询不会重复结果。
IEnumerable<T> itemsA = ...;
IEnumerable<T> itemsB = ...;
IEnumerable<T> itemsC = ...;
return itemsA.Concat(itemsB).Concat(itemsC);
也许我说得太迟了,但我希望这对将来的任何人都有帮助。
可以使用insert函数在特定索引处添加项。 列表。插入(0项);
实现IEnumerable和IEnumerator(从IEnumerable返回)的实例没有任何允许修改收集的api,接口提供只读api。
实际上改变集合的2种方法:
如果实例恰好是一些写API的集合(例如List),你可以尝试转换为这种类型:
list = enumerableInstance as IList<string>;
从IEnumerable中创建一个列表(例如,通过LINQ扩展方法toList():
var list = enumerableInstance.toList();