0

我有以下课程

public class PaymentItemViewModel
    {
        public List<int> Placements { get; set; }

        public int StandardPayment { get; set; }

    }

然后一个函数返回以下内容

IEnumerable<PaymentItemViewModel> paymentItems

如何使用 LINQ 获取所有展示位置 ID 的列表?

我可以执行以下操作吗?

List<int> placementIds = paymentItems.Any(x=>x.Placements) ??
4

4 回答 4

3

可能您正在寻找Enumerable.SelectMany方法

List<int> placementIds = paymentItems.SelectMany(vm => vm.Placements).ToList()
于 2013-10-10T03:13:15.060 回答
2

你可以这样做:

var placementIds = new List<int>();

foreach(var item in paymentItems)
{
    foreach(var placementId in item.Placements)
    {
        placementIds.Add(placementId);
    }
}

如果你真的想在 LINQ 中这样做,那么你可以这样做:

var placementIds = paymentItems.SelectMany(item => item.Placements).ToList();
于 2013-10-10T03:12:13.070 回答
2

这应该有效。Any() 只是查看是否存在,并采用布尔值。 SelectMany抓取所有属性或对象“并将结果序列展平为一个序列”。

List<int> placementIds = paymentItems.SelectMany(x=>x.Placements).ToList();
于 2013-10-10T03:12:56.027 回答
0

from aPaymentModelView in PaymentItems
from aPlacements in aPaymentmodelView
select aPlacements

这应该按照这个工作

LINQ 中的扁平化列表

编辑

由hazzik很好地提供

var ids1 = (from model in models from placement in model.Placements select placement).ToList();

我想我不明白它如何知道连接List<int>s

如果我选择放置,然后选择 ToList,我应该得到一个List<List<int>>

编辑 2 好的,所以实际上是交叉连接

from aModel in Models from aPlacement in aModel.Placements

产生一个 { Model, Placements } 的元组,但这些元组是隐式连接的,你所要做的就是排除外部标签,模型

编辑 3 我想它不能被认为是一个交叉连接,虽然它感觉像一个,但由于放置已经被隔离到单独的列表中,它实际上只是一个完整的广度和深度树遍历,

这只能由 M-soft-ism SelectMany准确描述

我从 ToString 为 var 报告的类型中得到了这个想法。它具有 SelectMany 迭代器的类型。

于 2013-10-10T03:56:03.807 回答