通过两个字段获取不同的值

时间:2015-03-26 17:51:48

标签: c# linq list

我有一个List<T>对象:

List<MyCampaignClass> campaignsToProcess = new List<MyCampaignClass>();

我通过LINQ对上游数据进行了一些过滤。

var results= from h in campaignHistory
             join a in campaignAvailability
             on new { h.campaignId, h.reportDate } equals new { a.campaignId, a.reportDate }
             where h.operationDate >= a.startDate
             select h;

然后我将它添加到我正在运行的List<T>对象中。我希望声明的类中有两个值:MyCampaignClass.campaignIdMyCampaignClass.reportDate

results.Select(m =>
    new MyCampaignClass()
    {
        campaignId = m.campaignId,
        reportDate = m.reportDate
    })
    .Distinct() //doesn't work
    .ToList()
    .ForEach(p => campaignsToProcess.Add(p));

我无法理解为什么.Distinct()无效。

1 个答案:

答案 0 :(得分:3)

有一种简单的方法,您可以先使用匿名类型然后再制作另一个投影来转换它们MyCampaignClass

historyResults
.Select(m => new { m.campaignId, m.reportDate })
.Distinct()
.Select(m =>
new MyCampaignClass()
{
    campaignId = m.campaignId,
    reportDate = m.reportDate
});

这是有效的,因为匿名类型是通过属性值而不是它们的引用来比较的。

另一种方法是在Equals中正确覆盖GetHashcodeMyCampaignClass方法,或为您的班级实施IEqualityComparer<T>并将其传递给Distinct方法。