我正在使用此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
如何正确比较两个列表并返回另一个列表中不存在特定属性值的对象?
答案 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<>
基于ThresholdType
,Add
,您只需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();