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



我有两个列表视图,它们具有相同的数据,但记录数不同。我想在第三个列表视图中获取不匹配的列表视图项。我使用了以下代码,但它没有帮助。变量 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));

您正在寻找 LINQ Except 方法

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

但是,您需要重写ListViewItem类的EqualsGetHashCode方法。如果没有执行此操作的选项(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();
    }
}

最终代码是:

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

LINQ 本身没有"设置差分"运算符...但您可以使用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();

试试这个

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

相关内容

  • 没有找到相关文章

最新更新