如何从存在于另一个列表中的结构列表中删除项
本文关键字:列表 删除 结构 另一个 存在 | 更新日期: 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