如何从存在于另一个列表中的结构列表中删除项

本文关键字:列表 删除 结构 另一个 存在 | 更新日期: 2023-09-27 18:12:21

public struct RegistryApp
{
    public string VendorName;
    public string Name;
    public string Version;
} 

我有两个List<RegistryApp>,其中包含当前安装在Windows盒子上的所有应用程序。为什么两个?我有一个列表来保存所有x86应用程序,一个列表来保存所有x64应用程序。

List<RegistryApp> x64Apps64List = new List<RegistryApp>();
List<RegistryApp> x64Apps32List = new List<RegistryApp>();

用从注册中心检索到的相应数据填充这两个数据后,我尝试以下操作以确保没有重复数据。这在List<string>上工作得很好,但不能与List<RegistryApp>一起工作。

List<RegistryApp> ListOfAllAppsInstalled = new List<RegistryApp>();
IEnumerable<RegistryApp> x86Apps = x64Apps32List.Except(x64Apps64List);
IEnumerable<RegistryApp> x64Apps = x64Apps64List.Except(x64Apps32List);
foreach (RegistryApp regitem in x86Apps)
{
    if ((regitem.Name != null) && 
     (regitem.Name.Length > 2) && 
     (regitem.Name != "")) 
    {
        ListOfAllAppsInstalled.Add(regitem);
    }
}
foreach (RegistryApp regitem in x64Apps) 
{
    if ((regitem.Name != null) && 
     (regitem.Name.Length > 2) && 
     (regitem.Name != "")) 
    {
        ListOfAllAppsInstalled.Add(regitem);
    }
}

有什么办法能成功吗?

如何从存在于另一个列表中的结构列表中删除项

EDITED

要从存在于另一个List中的struct List中删除项,您可以看到Cuong Le提供的解决方案:

https://stackoverflow.com/a/12784937/1507182

通过对List类型使用Distinct无参数扩展方法,可以删除这些重复元素。

然后,可以选择性地调用ToList扩展来获得删除重复项的实际List。

static void Main()
    {
    // List with duplicate elements.
    List<int> mylist = new List<int>();
    mylist.Add(1);
    mylist.Add(2);
    mylist.Add(3);
    mylist.Add(3);
    mylist.Add(4);
    mylist.Add(4);
    mylist.Add(4);
    foreach (int value in mylist)
    {
        Console.WriteLine("Before: {0}", value);
    }
    // Get distinct elements and convert into a list again.
    List<int> distinct = mylist.Distinct().ToList();
    foreach (int value in distinct)
    {
        Console.WriteLine("After: {0}", value);
    }
    }

如果我的答案已经解决了你的问题,点击接受作为解决方案按钮,这样做会帮助其他人知道解决方案

要使except工作,您正在使用它的东西必须具有可比性。要使它为您的自定义结构工作,您需要做两件事之一,要么重写GetHashCode和Equals,以便能够使用Execpt与您的结构:

public struct RegistryApp
{
    public string VendorName;
    public string Name;
    public string Version;
    public override bool Equals(object obj) 
    {
       if (!(obj is MyStruct))
          return false;
       RegistryApp ra = (RegistryApp) obj;
       return ra.VendorName == this.VendorName &&
              ra.Name == this.Name &&
              ra.Version == this.Version;
    }
    public override int GetHashCode()
    {
        return VendorName.GetHashCode() ^ Name.GetHashCode() ^ Version.GetHashCode();
    }
} 

或者使用Execpt的重载,它允许您传入自己的比较器并传入。有关示例,请参阅MSDN