我的问题如上所述。例如
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>?
当前回答
要添加第二条消息,您需要-
IEnumerable<T> items = new T[]{new T("msg")};
items = items.Concat(new[] {new T("msg2")})
其他回答
不,IEnumerable不支持向它添加项目。另一种解决方案是
var myList = new List(items);
myList.Add(otherItem);
你可以做到的。
//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;
类型IEnumerable<T>不支持此类操作。IEnumerable<T>接口的目的是允许使用者查看集合的内容。不修改值。
当你执行像. tolist (). add()这样的操作时,你是在创建一个新的List<T>并向该列表添加一个值。它与原始列表没有关联。
您可以使用Add扩展方法使用添加的值创建一个新的IEnumerable<T>。
items = items.Add("msg2");
即使在这种情况下,它也不会修改原始的IEnumerable<T>对象。这可以通过持有对它的引用来验证。例如
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
在这组操作之后,变量temp仍然只引用值集中具有单个元素“foo”的枚举数,而项目将引用值为“foo”和“bar”的不同枚举数。
EDIT
我经常忘记Add不是IEnumerable<T>上的典型扩展方法,因为它是我最后定义的第一个扩展方法之一。在这里
public static IEnumerable<T> Add<T>(this IEnumerable<T> e, T value) {
foreach ( var cur in e) {
yield return cur;
}
yield return value;
}
也许我说得太迟了,但我希望这对将来的任何人都有帮助。
可以使用insert函数在特定索引处添加项。 列表。插入(0项);
关于为什么不能(也不应该!)向IEnumerable中添加项,其他人已经给出了很好的解释。我只会补充说,如果您希望继续为表示集合的接口编码,并且想要一个add方法,那么您应该为ICollection或IList编码。作为额外的财源,这些接口实现了IEnumerable。