我有这个课程(部分列出):
class CiscoSwitch
{
private string _SwitchName = string.Empty;
public SwitchName {get {return _SwitchName;} set{_SwitchName=value; }}
}
我有2个CiscoSwitch对象列表。我正在尝试将它们进行比较以挑选出不重复的样品。我只想要重复的。我尝试了Lambda表达式,但遇到了一个编译器错误,即CiscoSwitch是非代理类型。
我现在想知道这样的事情-它会让我使用List.Except()方法(我认为):
static class SwitchComparer
{
static bool CompareSwitchNames(CiscoSwitch s1, CiscoSwitch s2)
{
if (sw1.SwitchName == s2.SwitchName) {return true;}
else {return false;}
}
}
// to find the differences
// this is a method of the CiscoSwitchClass
private List<CiscoSwitch> FindDifferences(List<CiscoSwitch> List1, List<CiscoSwitch> List2)
{
return List1.Except(List2, SwitchComparer.CompareSwitchNames();
}
这也可以使用foreach来完成,但是我认为这种方法更干净(如果正确的话)。我还认为有一天我可能想比较一下CiscoSwitch的其他属性,以便可以在需要时将方法添加到SwitchComparer类中。
最佳答案
不,只有这样的一种方法对您没有帮助。您需要实现一个IEqualityComparer<CiscoSwitch>
传递给Enumerable.Except
-即使这样,您的代码也必须是:
return List1.Except(List2, new SwitchComparer()).ToList();
不过,在
Equals
中覆盖GetHashCode
和CiscoSwitch
将更自然地解决问题-理想情况下,您也应该实现IEquatable<CiscoSwitch>
。但是,值得注意的是,像这样的可变类型在
Dictionary<,>
之类的东西上不能很好地发挥作用-如果在将对象作为键插入字典后更改对象的方式会影响其哈希码,将无法再次达到目标。如果可以,请考虑使类型不可变。还有两点需要注意:
任何时候写:
if (condition)
{
return true;
}
else
{
return false;
}
您应该编写简单得多的代码:
return condition;
因此,您的
CompareSwitchNames
方法将是:静态布尔CompareSwitchNames(CiscoSwitch s1,CiscoSwitch s2)
{
返回s1.SwitchName == s2.SwitchName;
}
您的
FindDifferences
参数名称应遵循.NET命名约定(例如list1
和list2
)使用
Except
只会在第一个列表中找到您不在第二个列表中的元素。如果需要找到对称差异,请考虑显式使用HashSet<T>
。编辑:如果您想有多种比较方法,则可以像:
public static class SwitchComparers
{
public static readonly IEqualityComparer<CiscoSwitch> ByName =
new ByNameComparer();
public static readonly IEqualityComparer<CiscoSwitch> ByCost =
new ByCostComparer();
private sealed class ByNameComparer : IEqualityComparer<CiscoSwitch>
{
// Implementation
}
private sealed class ByCostComparer : IEqualityComparer<CiscoSwitch>
{
// Implementation
}
}
关于c# - 寻找集合中的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9638093/