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

标签 c# .net linq

我有两个列表。一个列表是 Cascade 类型(名为 cascadeList),另一个列表是 PriceDetails 类型(名为 priceList),两个类如下所示。我还给出了一个简单的示例,说明了我在类下尝试实现的目标。

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

这就是 cascadeList 发挥作用的地方。因此,如果有 3 个具有相同 ISIN 的 PriceDetails,我想选择源在级联列表中排名最高的那个(1 是最高的)。希望下面的示例有所帮助。

问题原因

我确实有一些代码可以为我做这件事,但是由于我缺乏技能,它不是很有效。

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

我的类(class)

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

最佳答案

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

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

我们可以用 query or method syntax 来写这个查询.

使用查询语法:

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

P.S: 我假设列表的名称如下:pricesListcascadesList

关于c# - 根据另一个列表中的值从列表中选择多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34812055/

相关文章:

c# - 我应该在每次交易后关闭套接字(TCPIP)吗?

c# - WPF 全局异常处理程序

c# - 对象引用未设置到对象错误的实例

c# - 如何在查询语法中编写 Take(1)

c# - Entity Framework 4 中的简单条件 LINQ 查询

c# - RestRequest 在本地工作,但不能从 azure "The request was aborted: Could not create SSL/TLS secure channel."

javascript - 使用 C# 将 JSON 代码导入 Javascript 文件

c# - 如何使用 MSpec 为接口(interface)的所有实现编写通用测试?

.net - ASP.Net MVC 中的 JsonResult 又名 Json 函数中的控制序列化器?

c# - 我是否必须重新编译 .dll 才能在 Mono Android 项目上使用它?