c#中对象列表的xor

时间:2014-06-13 05:59:13

标签: c# xor

我在c#中对象之间进行xoring时遇到问题。 假设我有一个具有以下属性的类 -

public string UserName { get; set; }
public bool IsUserEmployed { get; set; }
public bool IsUserValid { get; set; }`

我有2个这类的列表:

List<Class1> List1 = new List<Class1>();
List<Class1> List2 = new List<Class1>();

我按照以下方式尝试了基本的xoring:

 FinalList.AddRange(List1.Except(List2));                  
 FinalList.AddRange(List2.Except(List1));`

但我没有得到FinalList的结果作为xor。

我想在List1List2上执行xor,它可以比较列表中对象中的所有3个属性,并给出第3个列表。请帮助。

4 个答案:

答案 0 :(得分:1)

您需要覆盖Class1的等号方法。

为什么呢?因为现在正在比较我认为在你的情况下总会返回false的实例。

public override bool Equals(Object obj)
{
    Class cs = (MyClass)obj;
    return UserName == cs.UserName && 
           IsUserEmployed  = cs.IsUserEmployed &&
           IsUserValid == cs.IsUserValid;
}

**你需要在obj不为空的地方放一些检查。

答案 1 :(得分:1)

这是LinqPad中的一个解决方案。我创建了一个自定义IEqualityComparerm,可以随意重用。要使用此比较器,我将2个参数传递给Except方法:第二个列表和比较器。

void Main()
{
    List<CustomObject> List1 = new List<CustomObject>() 
    {
        new CustomObject() {UserName ="1", IsUserEmployed = true, IsUserValid = false},
        new CustomObject() {UserName ="2", IsUserEmployed = true, IsUserValid = false},
        new CustomObject() {UserName ="3", IsUserEmployed = true, IsUserValid = false},
        new CustomObject() {UserName ="4", IsUserEmployed = true, IsUserValid = false}
    };
    List<CustomObject> List2 = new List<CustomObject>() 
    {
        new CustomObject() {UserName ="2", IsUserEmployed = true, IsUserValid = false},
        new CustomObject() {UserName ="3", IsUserEmployed = true, IsUserValid = false},

    };

    IEqualityComparer<CustomObject> CustomComparer = new CustomObjectEqualityComparer<CustomObject>();

    var xor = List1.Except(List2, CustomComparer).ToList().Dump();


}
public class CustomObject 
{
    public string UserName { get; set; }
    public bool IsUserEmployed { get; set; }
    public bool IsUserValid { get; set; }
}


public class CustomObjectEqualityComparer<T> : IEqualityComparer<CustomObject>
{
    public bool Equals(CustomObject t1, CustomObject t2)
    {
        if(t1.IsUserEmployed == t2.IsUserEmployed &&
           t1.IsUserValid ==t2.IsUserValid &&
           t1.UserName == t2.UserName)
       {
            return true;
       }

        return false;
    }

    public int GetHashCode(CustomObject _obj)
    {
        return _obj.IsUserEmployed.GetHashCode() + _obj.IsUserEmployed.GetHashCode() + _obj.IsUserValid.GetHashCode();
    }
}
public static class IEnumerableExtensions
{
  public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
  {
    foreach (T item in source)
      action(item);
  }
}

作为一个小注释:此代码不检查null或其他可能的错误。

答案 2 :(得分:0)

快速xor IList集合的替代实现

public static IList<T> ExclusiveOr<T>([NotNull]this IList<T> @this, IList<T> a)
{
    a = a ?? new T[]{};
    ISet<T> set = new HashSet<T>(@this);
    foreach (T current in a)
    {
        if (set.Contains(current))
        {
            set.Remove(current);
        }
        else
        {
            set.Add(current);
        }
    }
    return set.ToList();
}

答案 3 :(得分:0)

在两个列表之间存在XOR,左XOR或右XOR的扩展: https://stackoverflow.com/a/45480272/2546739

您可以根据自己的选择使用IEqualityComparer或不使用它。