我的问题如上所述。例如
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不支持向它添加项目。另一种解决方案是
var myList = new List(items);
myList.Add(otherItem);
其他回答
不能,因为IEnumerable<T>不一定表示可以添加项的集合。事实上,它并不一定代表一个集合!例如:
IEnumerable<string> ReadLines()
{
string s;
do
{
s = Console.ReadLine();
yield return s;
} while (!string.IsNullOrEmpty(s));
}
IEnumerable<string> lines = ReadLines();
lines.Add("foo") // so what is this supposed to do??
但是,您可以创建一个新的IEnumerable对象(未指定类型),当它被枚举时,将提供旧对象的所有项,以及您自己的一些项。你使用Enumerable。为此Concat:
items = items.Concat(new[] { "foo" });
这不会改变数组对象(无论如何,您不能将项插入到数组中)。但它将创建一个新对象,该对象将列出数组中的所有项,然后是“Foo”。此外,新对象将跟踪数组中的变化(即无论何时枚举它,您都将看到项目的当前值)。
最简单的方法很简单
IEnumerable<T> items = new T[]{new T("msg")};
List<string> itemsList = new List<string>();
itemsList.AddRange(items.Select(y => y.ToString()));
itemsList.Add("msg2");
然后你可以返回list作为IEnumerable,因为它实现了IEnumerable接口
要添加第二条消息,您需要-
IEnumerable<T> items = new T[]{new T("msg")};
items = items.Concat(new[] {new T("msg2")})
一对简短,甜蜜的扩展方法IEnumerable和IEnumerable<T>做它为我:
public static IEnumerable Append(this IEnumerable first, params object[] second)
{
return first.OfType<object>().Concat(second);
}
public static IEnumerable<T> Append<T>(this IEnumerable<T> first, params T[] second)
{
return first.Concat(second);
}
public static IEnumerable Prepend(this IEnumerable first, params object[] second)
{
return second.Concat(first.OfType<object>());
}
public static IEnumerable<T> Prepend<T>(this IEnumerable<T> first, params T[] second)
{
return second.Concat(first);
}
优雅(好吧,非通用版本除外)。可惜这些方法不在BCL中。
IEnumerable items = Enumerable.Empty(T);
List somevalues = new List();
items.ToList阀门()(someValues); items.ToList () .AddRange (someValues);