查找从2个列表中添加和删除的元素

时间:2016-08-17 16:17:33

标签: c#

我有

scansBindingList.Sort = "LastWriteTime Desc"

我想从中得到:

var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 4 };

元素是截然不同的。

我怎么能:

listAdded: {4}
listRemoved: {2}

我目前正在使用*Quickly find if list1 and list2 are the same (no changes) *Get the list of changes (added & removed)? ,但如果能让事情变得更快,我可以List<T>开放。

3 个答案:

答案 0 :(得分:2)

只需使用Except,即可获得新集合中两个列表之间的差异,然后您可以检查新集合的计数,看它们是否存在差异。

var removed = list1.Except(list2).ToList();
var added = list2.Except(list1).ToList();

然后你可以自由地在他们的伯爵身上做一个简单的事情:

bool areDifferent = removed.Count > 0 || added.Count > 0;

或凯文建议:

bool areDifferent = removed.Any() || added.Any();

答案 1 :(得分:0)

使用LINQ的伪代码 - (已删除 - 请参阅@ meJustAndrew的答案以获得更好的LINQ实现)

如果列表已排序,您可以执行O(n)操作:

int i = 0;
int j = 0;

while(i < list1.Count && j < list2.Count)
{
   if (list1[i] == list2[j])
   {
     ++i;
     ++j;
   }
   else if (list1[i] < list2[j])
   {
     removed.Add(list1[i]);
     ++i;
   }
   else // if (list1[i] > list2[j])
   {
     added.Add(list2[j]);
     ++j;
   }
}

if (i < list1.Count)
{
  removed.AddRange(list1.GetRange(i,list1.Count));
}
if (j < list2.Count)
{
  added.AddRange(list2.GetRange(j,list2.Count));
}

答案 2 :(得分:0)

您可以创建一个派生自List&lt;&gt;的类并覆盖Add()和Remove()。

Public class MyList<T> : List<T>
{

    private List<T> oldItems = new List<T>();
    private List<T> newItems = new List<T>();

    private List<T> items = new List<T>();
    public List<T> Items 
    {
        get { return items; }
        set { items = value; }
    }

    public void Add(T value)
    {
        Items.Add(value);
        newItems.Add(Items.Where(w=>w==value)); // must be the object in the "Items" list
    }

    public void Remove(T value)
    {
        Items.Remove(value);
        oldItems.Add(value); //value does not exist anymore in `Items`
    }

    public List<T> GetOldItems()
    {
        List<T> oldi = oldItems;
        oldItems.Clear();
        return oldi;
    }

    public List<T> GetNewItems() //
    {
        List<T> newi = newItems;
        newItems.Clear();
        return newi;
    }
}

然后,您有一个列表,其中包含旧项目和新项目的列表。

当您添加项目时,如果您删除项目,它将被注册。 当您获得新旧项目时,将清除注册表。