Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq获取两个列表视图的差异,并将其放在Windows窗体C中的第三个列表视图中#_C#_Winforms_Linq_Listview - Fatal编程技术网

C# Linq获取两个列表视图的差异,并将其放在Windows窗体C中的第三个列表视图中#

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

我有两个列表视图,它们的数据相同,但记录数不同。我想在第三个列表视图中获取不匹配的listviewitems。我已经使用了下面的代码,但它没有帮助。变量x和y正在制造问题

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();