Linq find differences in two lists

后端 未结 4 1169
一个人的身影
一个人的身影 2020-12-03 05:05

I have two list of members like this:

Before: Peter, Ken, Julia, Tom

After: Peter, Robert, Julia, Tom

As you can see, Ken is is out and Robert is in.

4条回答
  •  时光说笑
    2020-12-03 06:07

    Here is the version having O(n) complexity, provided your sequences are both ordered:

        public static IEnumerable SymmetricDifference(IEnumerable coll1, IEnumerable coll2, IComparer cmp)
        {
            using (IEnumerator enum1 = coll1.GetEnumerator())
            using (IEnumerator enum2 = coll2.GetEnumerator())
            {
                bool enum1valid = enum1.MoveNext();
                bool enum2valid = enum2.MoveNext();
                while (enum1valid && enum2valid)
                {
                    int cmpResult = cmp.Compare(enum1.Current, enum2.Current);
                    if (cmpResult < 0)
                    {
                        yield return enum1.Current;
                        enum1valid = enum1.MoveNext();
                    }
                    else if (cmpResult > 0)
                    {
                        yield return enum2.Current;
                        enum2valid = enum2.MoveNext();
                    }
                    else
                    {
                        enum1valid = enum1.MoveNext();
                        enum2valid = enum2.MoveNext();
                    }
                }
                while (enum1valid)
                {
                    yield return enum1.Current;
                    enum1valid = enum1.MoveNext();
                }
                while (enum2valid)
                {
                    yield return enum2.Current;
                    enum2valid = enum2.MoveNext();
                }
            }
        }
    
    
        public static IEnumerable SymmetricDifference(IEnumerable coll1, IEnumerable coll2)
        {
            return SymmetricDifference(coll1, coll2, Comparer.Default);
        }
    

提交回复
热议问题