我的问题如上所述。例如

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

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


当前回答

在.net Core中,有一个方法Enumerable。附加就是这样做的。

该方法的源代码可在GitHub.....上获得实现(比其他答案中的建议更复杂)值得一看:)。

其他回答

我只是想说,除了Enumerable。Concat扩展方法,似乎有另一个方法名为Enumerable。在. net Core 1.1.1中添加。后者允许您将单个项连接到现有序列。所以Aamol的答案也可以写成

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

不过,请注意,这个函数不会改变输入序列,它只是返回一个包装器,将给定的序列和附加的项放在一起。

类型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;
}

当然,你可以(我把你的T-business放在一边):

public IEnumerable<string> tryAdd(IEnumerable<string> items)
{
    List<string> list = items.ToList();
    string obj = "";
    list.Add(obj);

    return list.Select(i => i);
}

一对简短,甜蜜的扩展方法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<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接口