繁体   English   中英

根据另一个列表中的值从列表中选择多个对象

[英]select multiple objects from list based on values from another list

我有两个清单。 一个列表是Cascade类型(命名为cascadeList),另一个列表是PriceDetails类型(名为priceList),两个类都显示如下。 我还给出了一个简单的例子,说明我想要在课程下面实现的目标。

因此priceList包含PriceDetail对象的列表,其中它们可以是具有相同ISIN的多个(最多三个)PriceDetail对象。 当有多个具有相同ISIN的PriceDetails时,我想根据Source字段选择一个。

这是cascadeList的用武之地。所以如果有3个具有相同ISIN的PriceDetails,我想选择源级联列表中排名最高的那个(1是最高的)。 希望以下示例有所帮助。

问题的原因

我确实有一些代码正在为我这样做,但由于我的技能不足,它的效率不高。

简而言之,它首先从priceList创建一个唯一的ISIN列表。 然后它为每个唯一的ISIN循环遍历此列表,以获得具有相同ISIN的PriceDetails列表,然后使用一些if语句来确定我想要的对象。 所以希望并且非常确定有更好的方法来做到这一点。

我的课程

class Cascade
{
     int Rank;
     string Source;
}


class PriceDetails
{
     string ISIN;
     string Sedol;
     double Price;
     string Source;
}

PriceList                                Cascade
ISIN   Source    Price                   Source    Rank
BN1    XYZ       100                     ABC       1
MGH    PLJ       102                     XYZ       2
BN1    PLJ       99.5                    PLJ       3
BN1    ABC       98
MGH    XYZ       102

结果我正在寻找

PriceList
ISIN   Source   Price
BN1    ABC      98
MGH    XYZ      102
from pr in priceList
join c in cascadeList on pr.Source = c.Source
order by c.Rank
select new {Isin = pr.Isin, Source = pr.Source, Price = pr.Price}

为了获得所需的结果,我们必须执行以下步骤:

  1. 根据Source属性加入两个列表。
  2. ISIN属性对最后一个结果进行分组。
  3. 分组后,我们必须获得每个ISIN的最低排名。
  4. 然后我们将使用minRank变量将其与具有相同ISIN的元素的等级进行比较,然后选择第一个元素。

我们可以使用查询方法语法编写此查询。

使用查询语法:

var result = from pr in pricesList
             join cas in cascadesList on pr.Source equals cas.Source
             select new { pr, cas } into s
             group s by new { s.pr.ISIN } into prcd
                let minRank = prcd.Min(x => x.cas.Rank)
             select prcd.First(y => y.cas.Rank == minRank).pr;

使用方法语法:

var result = pricesList.Join(cascadesList,
                  pr => pr.Source,
                  cas => cas.Source,
                  (pr, cas) => new { pr, cas })
            .GroupBy(j => j.pr.ISIN)
            .Select(g => new { g, MinRank = g.Min(x => x.cas.Rank) })
            .Select(r => r.g.First(x => x.cas.Rank == r.MinRank).pr);

两种方式的结果都是相同的:

PriceList
ISIN   Source   Price
BN1    ABC      98
MGH    XYZ      102

PS:我假设列表的名称如下: pricesListcascadesList

看看这是否适合你

priceList.GroupBy(p => p.ISIN).OrderByDescending(p =>
    cascadeList.FirstOrDefault(c => c.Source == p.Source).Rank).First();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM