C# 将 2 个列表与字符串数组 属性 进行比较

C# comparing 2 lists with string array property

我有一个 class 和 List<String> 中的一个 属性 来保存一个或多个字符串 ID 的动态列表。

public class FieldCompareItem
{
    public List<string> Fields = new List<string>();

    public FieldCompareItem(string[] fields)
    {
        for (int i = 0; i < fields.Count(); i++)

            Fields.Add(fields[i]);
        }
    }
}

我正在尝试比较 2 个列表以查看字符串数组是否匹配,但它不起作用。基本上,我想进行 A/B 比较以获取仅存在于 A、B 和两者中的项目,如下所示:

var listA = new List<FieldCompareItem>
        {
            new FieldCompareItem(new[] {"a1"}),
            new FieldCompareItem(new[] {"a2"}),
            new FieldCompareItem(new[] {"a3","001"})
        };

var listB = new List<FieldCompareItem>
        {
            new FieldCompareItem(new[] {"a2"}),
            new FieldCompareItem(new[] {"a3"}),
            new FieldCompareItem(new[] {"a3","001"}),
            new FieldCompareItem(new[] {"a4"}),
            new FieldCompareItem(new[] {"a5"})
        };

//exists in A only
var aOnly = listA.Except(listB).ToList();
//expect a1,a3

//exists in B only
var bOnly = listB.Except(listA).ToList(); 
//expect a4,a5

//exists in both - this may be used for update A>B or B>A
var inBoth = ?????
//expect a2

因为它们是数组中的值 属性 它似乎无法按标准找到。任何帮助表示赞赏

首先创建一个比较器:

public class FieldCompareItemComparer: IEqualityComparer<FieldCompareItem>
{
  public bool Equals(FieldCompareItem x, FieldCompareItem y)
  {
    var result = x.Fields.SequenceEqual(y.Fields);
    return result;
  }

  public int GetHashCode(FieldCompareItem obj)
  {
    return String.Concat(obj.Fields).GetHashCode();
  }
}

然后像下面这样使用它:

var comparer = new FieldCompareItemComparer();

// exists in A only
var aOnly = listA.Except(listB, comparer).ToList();

// exists in B only
var bOnly = listB.Except(listA, comparer).ToList();

// exists in both
var inBoth = listA.Intersect(listB, comparer).ToList();