我的问题如上所述。例如

IEnumerable<T> items = new T[]{new T("msg")};
items.ToList().Add(new T("msg2"));

但毕竟里面只有一项。我们能不能有一个items.Add(item)方法,比如List<T>?


当前回答

你是否考虑过使用ICollection<T>或IList<T>接口来代替,它们存在的原因正是你想在IEnumerable<T>上有一个Add方法。

IEnumerable<T>用于“标记”一个类型为…嗯,可枚举的,或者只是一个项的序列,而不必保证真正的底层对象是否支持添加/删除项。还要记住,这些接口实现了IEnumerable<T>,所以你得到了所有的扩展方法,你也得到了IEnumerable<T>。

其他回答

最简单的方法很简单

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和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和IEnumerator(从IEnumerable返回)的实例没有任何允许修改收集的api,接口提供只读api。

实际上改变集合的2种方法:

如果实例恰好是一些写API的集合(例如List),你可以尝试转换为这种类型:

list = enumerableInstance as IList<string>;

从IEnumerable中创建一个列表(例如,通过LINQ扩展方法toList():

var list = enumerableInstance.toList();

也许我说得太迟了,但我希望这对将来的任何人都有帮助。

可以使用insert函数在特定索引处添加项。 列表。插入(0项);

要添加第二条消息,您需要-

IEnumerable<T> items = new T[]{new T("msg")};
items = items.Concat(new[] {new T("msg2")})