Linq获得两个listviews的差异,并将其放在Windows Form C中的第三个#

时间:2015-06-18 11:05:32

标签: c# winforms linq listview

我有两个列表视图,它们具有相同的数据,但记录数量不同。我想在第三个列表视图中获取不匹配的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));

3 个答案:

答案 0 :(得分:2)

您正在寻找LINQ Except method

var lvExcept1 = list1Source.Except(list2Source);
var lvExcept2 = list2Source.Except(list1Source);

lvDataToUpload = lvExcept1.Union(lvExcept2);

但您需要覆盖Equals课程的GetHashCodeListViewItem方法。如果没有选项(ListViewItem是Windows Forms类,而不是你的),你可以定义自己的相等比较器:

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

最终代码是:

var lvExcept1 = list1Source.Except(list2Source, new ListViewItemComparer());
var lvExcept2 = list2Source.Except(list1Source, new ListViewItemComparer());

lvDataToUpload = lvExcept1.Union(lvExcept2);

答案 1 :(得分:1)

LINQ没有&#34;设置差异&#34;运算符本身......但您可以使用Except两次:

var list1Text = list1Source.Select(x => x.Text);
var list2Text = list2Source.Select(x => x.Text);
var difference = list1Text.Except(list2Text)
                          .Concat(list2Text.Except(list1Text))
                          .ToList();

答案 2 :(得分:0)

试试这个

listIntersection = list1Source.Intersect(list2Source); // Gets matching elements
listUnion = list1Source.Union(list2Source); // Gets all elements

lvDataToUpload = listUnion.Except(listIntersection);