我有
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>
开放。
答案 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;
}
}
然后,您有一个列表,其中包含旧项目和新项目的列表。
当您添加项目时,如果您删除项目,它将被注册。 当您获得新旧项目时,将清除注册表。