C#中动态列表数的比较

时间:2018-05-31 07:53:47

标签: c# linq string-comparison

我有一个可变数量的List对象,我需要比较相同索引的值。列表中的条目数量是给定的,不会有所不同。

例如: 4个清单 每4个条目

所以我在这个例子中寻找的是4个bool,每个索引一个。 获取不匹配条目的索引也没关系。

伪:

bool isFirstEqual = (list1[i] == list2[i] == list3[i] == list4[i]);

但我需要以适用于可变数量列表的方式执行此操作。我可以有6个列表,但也有2个。

我正在考虑使用LINQ .Except()做一些事情,但我不确定如何将它与可变数量的列表一起使用。

我很难找到我确信在那里的优雅解决方案。 对此有任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:5)

如果我明白你的意思,这样的事情可能会起作用

public static bool IsEqual<T>(int index, params List<T>[] ary)
{
   for (var i = 1; i < ary.Length; i++)
      if (!EqualityComparer<T>.Default.Equals(ary[0][index], ary[i][index]))
         return false;         

   return true;
}

<强>用法

var isSecondelemEqual = IsEqual(1, list1, list2, list3,...)

<强>更新

基本上采用变量列表列表,并假设您要检查每个列表的索引。

答案 1 :(得分:1)

bool AreIndexesEqual(int index, List<List<int>> lists)
{
    int match = lists[0][index];

    foreach(List<int> list in lists.Skip(1))
    {
        if (list[index] != match)
        {
            return false;
        }
    }

    return true;
}

答案 2 :(得分:1)

举个例子:

List<List<int>> listOfLists = new List<List<int>>
{
    new List<int> { 1, 100, 2},
    new List<int> { 2, 100, 3},
    new List<int> { 3, 100, 4},
    new List<int> { 4, 100, 5},
};

List<>的{​​{1}}

将返回List<int>的完全不可读的LINQ表达式类似于:

List<bool>

在这里,我想告诉大家,如果您对问题的第一个解决方案是LINQ,那么现在可能会遇到两个问题。

现在......这个linq做了什么?我们有4 List<bool> result = Enumerable.Range(0, listOfLists.Count != 0 ? listOfLists[0].Count : 0) .Select(x => listOfLists.Count <= 1 ? true : listOfLists.Skip(1).All(y => y[x] == listOfLists[0][x]) ).ToList(); ,每个有3个元素......所以3行4列。我们想要“按行”计算结果,所以首先要发现行数,即List<int>(我们预先检查了我们有0行的情况)。现在,我们使用listOfLists[0].Count生成索引(如for),如Enumerable.Range(0, numberofrows)。对于每一行,我们看到是否有0或1列(for (int i = 0; i < numberofrows; i++)),结果为listOfLists.Count <= 1,否则我们将所有其他列true与第一列{{1}进行比较}。

使用双y[x]周期可能会更清晰:

listOfLists[0][x]

请注意,这两个程序都可以简化:for,因此空var result2 = new List<bool>(listOfLists.Count != 0 ? listOfLists[0].Count : 0); // Note the use of .Capacity here. It is listOfLists.Count != 0 ? listOfLists[0].Count : 0 for (int col = 0; col < result2.Capacity; col++) { if (listOfLists.Count <= 1) { result2.Add(true); } else { bool equal = true; for (int row = 1; row < listOfLists.Count; row++) { if (listOfLists[row][col] != listOfLists[0][col]) { equal = false; break; } } result2.Add(equal); } } 上的new int[0].All(x => something) == true.All()。您可以将IEnumerable<>true移至listOfLists.Count <= 1 ? true :关键字,仅保留if (...) { ... } else内的代码:

else

答案 3 :(得分:0)

你去吧

IEnumerable<bool> CompareAll<T>(IEnumerable<IEnumerable<T>> source)
{
    var lists = source.ToList();
    var firstList = lists[0];
    var otherLists = lists.Skip(1).ToList();

    foreach(var t1 in firstList)
    {
        yield return otherlists.All(tn => tn.Equals(t1));
    }
}