将项添加到IEnumerable

Cra*_*aig 6 c# ienumerable

我有一个List <>我的对象,但现在需要将其更改为IEnumerable <>.所以,我有这个:

public IEnumerable<TransactionSplitLine> TransactionSplitLines { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是,我不能再做了:

reply.TransactionSplitLines.Add(new TransactionSplitLine
                                                    {Amount = "100", Category = "Test", SubCategory = "Test More", CategoryId=int.Parse(c)});
Run Code Online (Sandbox Code Playgroud)

我现在应该如何添加物品?

slo*_*oth 19

您可以使用Concat执行以下操作:

reply.TransactionSplitLines = 
    reply.TransactionSplitLines.Concat(new []{new TransactionSplitLine                                                     {
                                                 Amount = "100", 
                                                 Category = "Test", 
                                                 SubCategory = "Test More",
                                                 CategoryId = int.Parse(c)}});
Run Code Online (Sandbox Code Playgroud)

这基本上创造了一个新的IEnumerable.由于没有足够的关于您的用例的信息,很难说您的案例中最好的解决方案是什么.

编辑: 请注意List<T>工具IEnumerable<T>.因此,如果您需要传递IEnumerable<T>一个参数作为示例,您也可以传递一个List<T>代替,也许AsEnumerable()首先在您的列表上显式调用.所以也许你可以坚持使用List而不是IEnumerable.

  • 这是最好的答案,如果意图是调用者不应该对这个`IEnumerable <>`进行持久的更改 (2认同)

Rol*_*epp 9

简答:您无法添加项目IEnumerable<T>

稍微长一点的解释:

IEnumerable是一个仅关注能够枚举/迭代项集合的接口.这是存在的唯一目的IEnumerable.它抽象出了存储或检索可枚举项的方式的任何概念(它可能是一串字符,项列表,字节流或一系列计算结果),因此如果你有一个接口是IEnumerable,您无法向其添加项目,您只能迭代它提供的项目.

也就是说,添加项目的正确方法IEnumerable是返回new IEnumerable,并将新项目附加到原始内容中.

另外,对于Linq库,您有一个扩展方法,允许将IEnumerable转换为List IEnumerable.ToList(),您可以将项添加到列表中.虽然这不是正确的方式.

使用命名空间中的Linq库,您可以执行以下操作:

using System;
using System.Collections.Generic;
using System.Linq;

namespace EnumTester
{
    class Program
    {
        static void Main(string[] args)
        {
             IEnumerable<string> enum = GetObjectEnumerable();

             IEnumerable<string> concatenated = enum.Concat(new List<string> { "concatenated" });

             List<string> stringList = concatenated.ToList();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ita*_*aro 5

您无法添加项目,IEnumerable<T>因为此接口没有Add方法.
如果TransactionSplitLines总是返回a的实例,List<TransactionSplitLine>您可能希望将其类型更改为IList<TransactionSplitLine>.
如果您无法更改类型,TransactionSplitLines并且可以保证它始终返回a,IList<TransactionSplitLines>您可以将其转换为

((IList<TransactionSplitLine>)reply.TransactionSplitLines).Add(new TransactionSplitLine
                                                    {Amount = "100", Category = "Test", SubCategory = "Test More", CategoryId=int.Parse(c)});
Run Code Online (Sandbox Code Playgroud)

  • @Mudo:我会选择`IList <T>`而不是`IList` (2认同)