【问题标题】:How to compare all items in the lists are equal?如何比较列表中的所有项目是否相等?
【发布时间】:2018-10-30 23:38:42
【问题描述】:

我有一个列表,其中每个项目本身都是一个列表。 如何检查所有单个项目是否相同?

static void Main(string[] args)
{
    var myList = new List<List<string>>();
    var myItem1 = new List<string> { "str1", "str2" };
    var myItem2 = new List<string> { "str1", "str2" };

    myList.Add(myItem1);
    myList.Add(myItem2);

    var total = ??  // <- I'm stuck here

    Console.WriteLine(total);
    Console.ReadKey();
}

现在我想检查 myList 中的每个项目是否相等。 我确实尝试过这个:Check if two list have the same items,但无法解决。

【问题讨论】:

  • 物品的顺序或重复是否重要?
  • 我投票决定将此问题作为题外话结束,因为simple google search would bring the answer to it。提示:如果此方法不返回任何项目 - 它相等
  • 当您在尝试链接答案时说“无法解决”时 - 您得到了什么结果以及您尝试了什么?
  • @AlexandruPuiu,没关系。
  • 所以在您的示例中,您是否希望结果为false,因为myList 包含"str1""str2"(它们不相等)?

标签: c# linq


【解决方案1】:

您可以尝试类似this 的方法,如果列表的元素都相同,它应该输出 true。

对于您的代码:

if (myList.Any(item => !Enumerable.SequenceEqual(item, myList[0])))

【讨论】:

    【解决方案2】:

    要检查所有列表是否包含完全相同的元素,我们可以使用SequenceEqual 方法,它比较元素本身及其顺序。但是,既然您说顺序无关紧要,那么我们在进行比较时必须先对列表进行排序。

    如果All 列表(第一个除外),以下代码行返回true,当减少到Distinct 项目然后排序(OrderBy)时,等于First 列表(当减少到Distinct 项并排序时):

    bool allAreEqual = myList
        .Skip(1)
        .All(subList => subList
            .Distinct()
            .OrderBy(item => item)
            .SequenceEqual(myList.First().Distinct().OrderBy(item => item)));
    

    与其在一行中完成所有操作,不如先获取不同的有序列表,然后进行比较(否则我们要为第一个项目订购其他每一项):

    var sortedLists = myList.Select(list => list.Distinct().OrderBy(item => item));
    var allAreEqual = sortedLists.Skip(1).All(list => list.SequenceEqual(sortedLists.First()));
    

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 2013-03-29
      • 2022-01-23
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多