我得到了班级Nomen的两个清单:

var N1 = new List<Nomen>();
var N2 = new List<Nomen>();


public class Nomen
{
    public string Id;

    public string NomenCode;

    ...

    public string ProducerName;

    public decimal? minPrice;
}


我需要加入他们。我曾经这样做:

result = N2.Union(N1, new NomenComparer()).ToList();

class NomenComparer : IEqualityComparer<Nomen>
{
    public bool Equals(Nomen x, Nomen y)
    {
        return x.Equals(y);
    }

    public int GetHashCode(Nomen nomen)
    {
        return nomen.GetHashCode();
    }
}

    public override int GetHashCode()
    {
        return (Id + NomenCode + ProducerName).GetHashCode();
    }

    public bool Equals(Nomen n)
    {
        if (!String.IsNullOrEmpty(Id) && Id == n.Id) return true;

        return (NomenCode == n.NomenCode && ProducerName == n.ProducerName);
    }


如您所见,如果Ids或NomenCode与ProducerName相等,对我来说就是相同的Nomen。
现在我的任务已经更改,如果相等,我需要采用最小价格最小的那个。请帮我解决这个问题。
试图对linq做同样的事情,但是失败了

        var groups = (from n1 in N1
                      join n2 in N2
                      on new { n1.Id, n1.NomenCode, n1.ProducerName } equals new { n2.Id, n2.NomenCode, n2.ProducerName }
                      group new { n1, n2 } by new { n1.Id, n1.NomenCode, n1.ProducerName } into q
                      select new Nomen()
                      {
                          NomenCode = q.Key.NomenCode,
                          ProducerName = q.Key.ProducerName,
                          minPrice = q.Min(item => item.minPrice)
                      }).ToList();


通常是因为我需要按ID或{NomenCode,ProducerName}加入Lists,但我不知道该怎么做。

最佳答案

Concat,GroupBy,然后再次选择?例如(比以前少未经测试):

var nomens = N1.Concat(N2)
    .GroupBy(n=>n, new NomenComparer())
    .Select(group=>group.Aggregate( (min,n) => min == null || (n.minPrice ?? Decimal.MaxValue) < min.minPrice ? n : min));

08-04 11:08