如何在C#中比较两个List <string []>

时间:2019-12-30 11:29:07

标签: c# compare

自动化-使用C#硒

我们正在读取一个表,该表返回List<string[]>中的值。我们需要比较执行操作前后的值,这不应影响表的内容。

是否可以比较两者

List<string[]> ExpRequestItemsWithSection  

List<string[]> ActRequestItemsWithSection

到现在为止,我一直在使用下面的代码,并且工作正常。但是,有没有其他方式来比较两个集合?有什么想法可以像我需要处理大量列表那样使此过程更快且资源占用更少?

bool isRequestsMatch = true;

for (int i = 0; i < ActRequestItemsWithSection.Count; i++)
{
  if (!((ActRequestItemsWithSection[i][0] == ExpRequestItemsWithSection[i][0]) && 
     (ActRequestItemsWithSection[i][1] == ExpRequestItemsWithSection[i][1])))
    isRequestsMatch = false;
}

“即时”窗口中的PFB屏幕截图

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:3)

好吧,如果订单重要,即

android:inputType="textNoSuggestions" 

 {["A", "B"]} != {["B, A"]}   // A and B swapped within the array

然后,您可以在 Linq 的帮助下检查相等性:

 {                   { 
  ["A", "B"],         ["C"],     // [A, B] and [C] arrays are swapped
  ["C"]        !=     ["A, "B"]
 }                   }

答案 1 :(得分:2)

有一个System.Collections.StructuralComparisons.StructuralEqualityComparer,但是出于某种晦涩的原因,它以丑陋的非泛型方式编写,因此很难用作泛型IEqualityComparer<>

如果您像这样包装它:

class GenericStructuralEqualityComparer<T> : EqualityComparer<T>
  where T : System.Collections.IStructuralEquatable
{
  public override bool Equals(T x, T y)
    => System.Collections.StructuralComparisons.StructuralEqualityComparer.Equals(x, y);

  public override int GetHashCode(T obj)
    => System.Collections.StructuralComparisons.StructuralEqualityComparer.GetHashCode(obj);
}

然后您可以在外部(SequenceEqauls)级别执行List<>

if (!
  ExpRequestItemsWithSection.SequenceEqual(ActRequestItemsWithSection,
    new GenericStructuralEqualityComparer<string[]>())
  )

也许比.Zip解决方案还漂亮?


添加:如果您喜欢.Zip,则可以使用StructuralEqualityComparer,而无需包装类:

if (
  ExpRequestItemsWithSection.Count != ActRequestItemsWithSection.Count
  ||
  ExpRequestItemsWithSection.Zip(ActRequestItemsWithSection,
    System.Collections.StructuralComparisons.StructuralEqualityComparer.Equals)
  .Contains(false)
  )

这使用方法组System.Collections.StructuralComparisons.StructuralEqualityComparer.Equals的签名和返回类型足以满足Func<string[], string[], bool>所采用的.Zip的要求(与C#7.3编译器一起尝试)。

答案 2 :(得分:0)

也许您正在寻找this answer

if (a1.SequenceEqual(a2))