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

C# 查找从2个列表中添加和删除的元素,c#,C#,我有 元素是不同的 我怎样才能: 我目前正在使用List,但如果它能让事情变得更快,我愿意使用HashSet。带有LINQ的伪代码-(已删除-请参阅@meJustAndrew的答案以了解更好的LINQ实现) 如果列表已排序,则可以执行O(n)操作: *Quickly find if list1 and list2 are the same (no changes) *Get the list of changes (added & removed)? inti=0; int j=0;

我有

元素是不同的

我怎样才能:

我目前正在使用
List
,但如果它能让事情变得更快,我愿意使用
HashSet

带有LINQ的伪代码-(已删除-请参阅@meJustAndrew的答案以了解更好的LINQ实现)

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

*Quickly find if list1 and list2 are the same (no changes)
*Get the list of changes (added & removed)?
inti=0;
int j=0;
而(i列表2[j])
{
添加。添加(列表2[j]);
++j;
}
}
如果(i
只需使用Except即可获得新集合中两个列表之间的差异,然后可以检查新集合的计数以查看它们是否存在差异

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));
}
然后,您可以根据他们的情况自由地执行以下简单操作:

var removed = list1.Except(list2).ToList();
var added = list2.Except(list1).ToList();
或者像凯文建议的那样:

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

您可以创建一个从列表派生的类,并重写Add()和Remove()

公共类MyList:列表
{
私有列表oldItems=新列表();
私有列表newItems=新列表();
私有列表项=新列表();
公共清单项目
{
获取{返回项;}
设置{items=value;}
}
公共无效添加(T值)
{
增加(价值);
newItems.Add(Items.Where(w=>w==value));//必须是“Items”列表中的对象
}
公共无效删除(T值)
{
项目。删除(值);
oldItems.Add(value);//值在`Items'中不再存在`
}
公共列表GetOldItems()
{
列出旧项=旧项;
oldItems.Clear();
返回oldi;
}
公共列表GetNewItems()//
{
列表newi=新项目;
newItems.Clear();
返回newi;
}
}
然后,您有一个列表,其中包含旧项目和新项目的列表

添加项目时,即使删除项目,也会注册该项目。
当您获得新的或旧的项目时,寄存器将被清除。

*快速查找列表1和列表2是否相同(无更改)
:对其中一个列表和for循环进行排序,并检查值是否与相同位置匹配。您是否可以显示与您拥有的内容相关的实际C代码。。?此外,在特定位置添加到列表以及从特定位置的列表中删除项目也不是那么困难。在谷歌上搜索关键字
RemoveAt
时,一定要使用哈希集使意图更清晰(不一定是为了提高性能)。然后是list2.Exception(list1)和list1.Exception(list2)的问题。这不应该是bool areDifferent=removed.Count()>0 | | added.Count()>0;或者可以使用removed.Any()| added.Any()
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();
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;
    }
}