我有这个课程(部分列出):

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中覆盖GetHashCodeCiscoSwitch将更自然地解决问题-理想情况下,您也应该实现IEquatable<CiscoSwitch>

但是,值得注意的是,像这样的可变类型在Dictionary<,>之类的东西上不能很好地发挥作用-如果在将对象作为键插入字典后更改对象的方式会影响其哈希码,将无法再次达到目标。如果可以,请考虑使类型不可变。

还有两点需要注意:


任何时候写:

if (condition)
{
    return true;
}
else
{
    return false;
}


您应该编写简单得多的代码:

return condition;


因此,您的CompareSwitchNames方法将是:

静态布尔CompareSwitchNames(CiscoSwitch s1,CiscoSwitch s2)
{
    返回s1.SwitchName == s2.SwitchName;
}
您的FindDifferences参数名称应遵循.NET命名约定(例如list1list2
使用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/

10-10 07:22