【发布时间】:2016-06-29 18:00:04
【问题描述】:
我有几个通用列表,其中包含一些共享数据和一些唯一数据。它们包含同一类的数据,但使用不同的参数(单位)填充。所以所有的通用列表都是这种类型:List<PriceVarianceData>
我想要对这些通用列表执行的操作是从它们中提取它们包含的不同数据的子集,然后对合并后的列表进行排序。
更具体地说,要查询的列表具有以下结构:
public class PriceVarianceData
{
public String Unit { get; set; }
public String ShortName { get; set; }
public String ItemCode { get; set; }
public String Description { get; set; }
public String PriceWeek { get; set; }
public String Week { get; set; }
public String Price { get; set; }
public String Variance { get; set; }
public String VarianceAverage { get; set; }
public int RegionOrder { get; set; }
public int ContractPrice { get; set; }
}
...我要提取数据的通用列表具有以下结构:
public class PriceVarianceSupersetDisplayData
{
public String ShortName { get; set; }
public String ItemCode { get; set; }
public String Description { get; set; }
}
单位将有一些相同的 ShortName + ItemCode + Description 值,我只想要这些值的唯一组合 - ShortName + ItemCode + Description 不应该重复,但是如果它们的任何值不同,它们是被认为是独特的/独特的。因此,提取的数据在排序后应如下所示:
SHORTNAME ITEMCODE DESCRIPTION
--------- -------- -----------
Fakeroo 001 Stratoblaster
Fender 001 Stratocaster
Gibson 001 335
Gibson 001 SG
Fender 002 Telecaster
Gibson 002 Les Paul
Carvin 003 Knife
Carvin 003 L6S
我 [认为我] 知道我需要的是 LINQ 查询;在伪代码中,类似于:
List<PriceVarianceSupersetDisplayData> displayDataAmalgamated = select distinct ShortName, ItemCode, Description from craftworksPVDList, chophousePVDList, gordonbierschPVDList, oldchicagoPVDList, oldchifranchisePVDList, rockbottomPVDList order by ItemCode then by ShortName, then by Description
...但不知道如何将其从伪代码转换为真正的 LINQ。
更新
user3185569 和 Zoran Horvat 的答案的组合似乎有效,但我显然没有得到不同的值。我的第一个线索是最终通用列表中的条目数量似乎太多了。
然后我查看了列表中的前两个条目,它们是(或至少看起来是)相同的:
这是我正在使用的代码;如前所述,它是提供的前两个答案的组合:
private List<PriceVarianceSupersetDisplayData> GetSharedDisplayDataForAll()
{
Func<PriceVarianceData, PriceVarianceSupersetDisplayData> selector =
(p => new PriceVarianceSupersetDisplayData()
{
ShortName = p.ShortName,
ItemCode = p.ItemCode,
Description = p.Description
});
List<PriceVarianceSupersetDisplayData> displayDataAmalgamated =
craftworksPVDList.Concat(chophousePVDList)
.Concat(chophousePVDList)
.Concat(gordonbierschPVDList)
.Concat(oldchicagoPVDList)
.Concat(oldchifranchisePVDList)
.Concat(rockbottomPVDList).Select(selector)
.Distinct()
.OrderBy(x => x.ItemCode)
.ThenBy(x => x.ShortName)
.ThenBy(x => x.Description).ToList();
return displayDataAmalgamated;
}
为什么 Distinct() 返回重复值?
【问题讨论】:
-
这很容易做到。但首先,
craftworksPVDList、chophousePVDList、gordonbierschPVDList等...都是同一类型?或者你的意思是结果应该是PriceVarianceSupersetDisplayData -
@user3185569:是的,您列出的所有内容都是 PriceVarianceData 列表,但其中的“最小化版本”(“PriceVarianceSupersetDisplayData”,可能命名错误)是存储合并结果的位置。跨度>
-
这更简单,请查看下面的方法。
标签: c# linq generic-list