比较列表以检索不匹配的对象属性

时间:2014-04-04 15:44:22

标签: c# linq

我正在使用此linq查询(在大多数情况下成功)来检查一个List与另一个List。目标是返回有效{1}}的对象,这些对象尚未包含在validThresholds列表中。

ThresholdType

由于某种原因,这让我很困惑,我得到了20个对象的结果。从可能的9个对象的列表与3个有效对象的列表进行比较。 显然我在这里的逻辑中犯了一些错误,但是我看不出我怎么能得到比两个集合的总和更多的结果!我真的很想知道为什么我得到这个结果。

最初我想使用// Filter out thresholds previously added manufacturerResult = (from r in validThresholds from t in manufacturerLevel where r.ThresholdType != t.ThresholdType select t).ToList(); ,但这限制了我,因为它只允许Join没有不等运算符。

下面我创建了一个重新创建问题的示例应用程序。

equals

如何正确比较两个列表并返回另一个列表中不存在特定属性值的对象?

3 个答案:

答案 0 :(得分:4)

  

如何正确比较两个列表并返回另一个列表中不存在特定属性值的对象?

这样的东西?

manufacturerResult = (from t in manufacturerLevel
                      // where a specific property value does not exist in the other
                      where !validThresholds.Any(
                         r => r.ThresholdType == t.ThresholdType)
                      select t).ToList();
  

我的目的是将来自manufacturerLevel的对象添加到validThresholds,其中validThreshold中的任何对象与manufacturerLevel中的任何对象不具有相同的ThresholdType值

validThresholds.AddRange(
    manufacturerLevel.Where(t => !validThresholds.Any(
                         r => r.ThresholdType == t.ThresholdType)));

您可能还想考虑一下,您真正​​想要做的是编译这些对象的Set。如果您validThresholds HashSet<>IEqualityComparer<>基于ThresholdTypeAdd,您只需ThresholdType所有项目,它就会自动生成{{1}}忽略其中{{1}}已在集合中表示的任何人。

答案 1 :(得分:2)

你可以这样做:

var result = manufacturerLevel.Where(t => !validThresholds.Any(t2 => t.ThresholdType == t2.ThresholdType));

编辑:

  

我的目的是将来自manufacturerLevel的对象添加到validThresholds,其中validThreshold中的任何对象与manufacturerLevel中的任何对象都没有相同的ThresholdType值

如果我理解它是正确的,你需要合并两个集合,对吗?

var validThresholds= validThresholds.Union(manufacturerLevel);

确保您正确覆盖Equals

中的ConsumableThreshold方法

答案 2 :(得分:1)

您也可以这样做,您可以使用自定义比较器来确定某个对象是否与另一个对象不同,然后在这些对象的集合上使用.Except。

public class ConsumableThreshold : IEqualityComparer<ConsumableThreshold>
    {
        public int ThresholdType { get; set; }
        public int ThresholdValue { get; set; }

        public int ConsumableType { get; set; }
        public int ConsumableVariantID { get; set; }
        public int ManufacturerID { get; set; }
        public int ModelID { get; set; }

        public bool Equals(ConsumableThreshold x, ConsumableThreshold y)
        {
            return x.ThresholdType == y.ThresholdType;
        }

        public int GetHashCode(ConsumableThreshold obj)
        {
            return obj.ThresholdType.GetHashCode();
        }
    }

然后得到这样的差异:

var diff = groupThresholds.Except(validThresholds).ToList();