C#使用LINQ查询自定义列表并返回新的子集列表

时间:2014-04-15 12:27:28

标签: c# linq

我有一个名为Holdings的自定义类型列表。我试图根据Holdings对象的一个​​属性查询列表,以返回一个新的Holdings列表。下面的LINQ查询确实可以正常工作,但我想将var unitHld替换为List unitHld,但无法使代码生效。

var unitHld = from hld in _holdingList
              where hld.FundCode == lookThroList[i].FundCode
              select new Holding() { Currency = hld.Currency, 
                                     FundCode = lookThroList[i].FundCode, 
                                     IdSedol = hld.IdSedol, 
                                     Nominal = hld.Nominal * unitWgt, 
                                     Price = hld.Price };

然后稍微更改这个新列表,然后再添加回原始列表(我知道逻辑听起来很奇怪,但请接受这是必须如何完成)。但是因为unitHld是var,所以下面的行不起作用。

_holdingList.Add(unitHld);

4 个答案:

答案 0 :(得分:2)

以下调用只添加一个项目(其中项目必须与列表元素的类型相同):

_holdingList.Add(unitHld);

但是你想要添加一系列项目,所以这样做:

_holdingList.AddRange(unitHld);

其中unitHldIEnumerable<T>,T为列表元素的类型。

(这个答案假定holdingList的类型为List<T>,而T实际上是Holding的例子。)

有关详细信息,请参阅List.AddRange()

答案 1 :(得分:1)

C#是静态类型的。

var不是一种类型,它只是在您输入IEnumerable<Holding>的情况下的快捷方式。

如果您希望结果为List<Holding>,那么您需要做的就是将查询括在括号中并将.ToList()放在最后。

但是,要将此附加到另一个列表,您不需要这样做。只需在另一个列表中拨打.AddRange即可。

或者,您可以使用Concat

var bothLists = aList.Concat(anotherList);

答案 2 :(得分:1)

  

我想将var unitHld替换为List unitHld,但无法使代码生效。

您需要在查询结果上调用ToList()

var unitHld = from hld in _holdingList
              where hld.FundCode == lookThroList[i].FundCode
              select new Holding() { Currency = hld.Currency, 
                                     FundCode = lookThroList[i].FundCode, 
                                     IdSedol = hld.IdSedol, 
                                     Nominal = hld.Nominal * unitWgt, 
                                     Price = hld.Price };
List<Holding> unitHldList = unitHld.ToList();
  

然后稍微更改此新列表,然后再将其添加回原始列表

数据在unitHldList后,您可以根据需要进行更改。

  

以下行不起作用。 _holdingList.Add(unitHld);

当您将集合的内容添加到List<T>时,请使用AddRange方法而不是Add

_holdingList.AddRange(unitHldList);

答案 3 :(得分:0)

试试这个:

_holdingList.AddRange(unitHld);