我有两个清单。一个列表是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
答案 0 :(得分:4)
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 :(得分:4)
为了获得理想的结果,我们必须执行以下步骤:
Source
属性加入两个列表。 ISIN
属性对最后一个结果进行分组。 ISIN
。 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: 我假设该列表的名称如下:pricesList
和cascadesList
答案 2 :(得分:0)
看看这是否适合你
priceList.GroupBy(p => p.ISIN).OrderByDescending(p =>
cascadeList.FirstOrDefault(c => c.Source == p.Source).Rank).First();