C# Linq获取两个列表视图的差异,并将其放在Windows窗体C中的第三个列表视图中#
我有两个列表视图,它们的数据相同,但记录数不同。我想在第三个列表视图中获取不匹配的listviewitems。我已经使用了下面的代码,但它没有帮助。变量x和y正在制造问题C# Linq获取两个列表视图的差异,并将其放在Windows窗体C中的第三个列表视图中#,c#,winforms,linq,listview,C#,Winforms,Linq,Listview,我有两个列表视图,它们的数据相同,但记录数不同。我想在第三个列表视图中获取不匹配的listviewitems。我已经使用了下面的代码,但它没有帮助。变量x和y正在制造问题 var list1Source = lvFace.Items.Cast<ListViewItem>(); var list2Source = lvDBdata.Items.Cast<ListViewItem>(); lvDataToUpload = list1Source.Where( (x
var list1Source = lvFace.Items.Cast<ListViewItem>();
var list2Source = lvDBdata.Items.Cast<ListViewItem>();
lvDataToUpload = list1Source.Where(
(x => list2Source.All(y => y.Text != x.Text));
var list1Source=lvFace.Items.Cast();
var list2Source=lvDBdata.Items.Cast();
lvDataToUpload=list1Source.Where(
(x=>list2Source.All(y=>y.Text!=x.Text));
试试这个
listIntersection = list1Source.Intersect(list2Source); // Gets matching elements
listUnion = list1Source.Union(list2Source); // Gets all elements
lvDataToUpload = listUnion.Except(listIntersection);
你在找什么
但是您需要为您的ListViewItem
类重写Equals
和GetHashCode
方法。如果没有执行此操作的选项(ListViewItem
是Windows窗体类,而不是您的),您可以定义自己的相等比较器:
public class ListViewItemComparer : IEqualityComparer<ListViewItem>
{
bool IEqualityComparer<ListViewItem>.Equals(ListViewItem x, ListViewItem y)
{
return (x.Text == y.Text);
}
int IEqualityComparer<ListViewItem>.GetHashCode(ListViewItem obj)
{
if (Object.ReferenceEquals(obj, null))
return 0;
return obj.Text.GetHashCode();
}
}
LINQ本身没有“set difference”操作符……但是您可以使用除了两次之外:
var list1Text = list1Source.Select(x => x.Text);
var list2Text = list2Source.Select(x => x.Text);
var difference = list1Text.Except(list2Text)
.Concat(list2Text.Except(list1Text))
.ToList();
这将找到交叉点,而不是区别。@JonSkeet请现在检查它是否正常……我在被否决时编辑了它:)@user2955299:“不工作”是对问题的模糊描述。如果你能说明你正在使用哪个版本的VisualStudio,以及你的应用目标是哪个版本的.NET,这也会有所帮助。有什么答案有用吗?我也编辑了我的答案,我想你想要两个列表中不匹配的元素,对吗?当你将光标悬停在错误上时,错误消息是什么?@user2955299向我显示代码。。。如果你需要帮助解决基本问题,建议你买乔恩的书。@user2955299:我肯定书中没有提到“系统。乐趣”。请发布准确的错误消息。@JonSkeet我已将截图上传到dropbox@user2955299:看看你截图中的代码——它不是我文章中的代码。我正在使用list1Source。选择
-您正在使用lvFace。选择
。是的,如果你使用与我的答案完全不同的代码,你会得到错误…我的错误。。。我将如何将差异变量转换为ListView?ListViewItem类不是要更改的OP类-并且这不会得到完全的差异,只有list1中的内容,而不是list2中的内容。列表2中的内容而不是列表1中的内容呢?@JonSkeet你是对的,我已经编辑了答案,一定是正确的。
var lvExcept1 = list1Source.Except(list2Source, new ListViewItemComparer());
var lvExcept2 = list2Source.Except(list1Source, new ListViewItemComparer());
lvDataToUpload = lvExcept1.Union(lvExcept2);
var list1Text = list1Source.Select(x => x.Text);
var list2Text = list2Source.Select(x => x.Text);
var difference = list1Text.Except(list2Text)
.Concat(list2Text.Except(list1Text))
.ToList();