排序2D数组列表

时间:2018-09-10 15:07:47

标签: c# arrays sorting

我正在尝试对包含bool 2D数组的列表进行排序,如下所示。

List<bool[,]>boolList;

bool[,] bool2DArray = {
    {true,true,true,true},
    {true,true,true,true},
    {true,true,true,true}
};

我一直在尝试按每个2D数组中的真实计数对它们所在的列表进行排序。

经过几个小时的搜索和整个Stackoverflow的查找,我仍然无法找到针对该特定问题的解决方案,在这种情况下,我无法找到的许多解决方案对我都行不通直接比较它们,而是对它们进行计算的结果使我尝试使用Lambada类型的解决方案,该解决方案也失败了,但我认为这可能是由于我不了解如何正确实现它。

任何帮助将不胜感激。

修改 我为获取计数而做的简单功能

int GetCount(bool[,]bool2DArray) {
    int count = 0;
    int rows = bool2DArray.GetUpperBound(0);
    int columns = bool2DArray.GetUpperBound(1);


    for (int x = 0; x <= rows; x++) {
        for (int i = 0; i <= columns; i++) {
            bool isTrue = bool2DArray[x, i];

            if (isTrue) {
                count++;
            }
        }
    }
    return count;
}

这是Lambada类型的解决方案,我认为方向正确,但是无效。

List<bool[,]> sortedList = boolList.Sort((a,b) => (GetCount(a).CompareTo(GetCount(b))));

2 个答案:

答案 0 :(得分:2)

您首先想了解如何轻松使用2d数组并计算其中的true数。为此,对于单个项目,您可以执行与该问题中发现的类似的操作:Fast way to convert a two dimensional array to a List ( one dimensional )

bool2DArray.Cast<bool>().Count(i => i)

然后用OrderDescendingBy包装,您将获得所需的结果:

var collection = new List<bool[,]> { bool2DArray, ... };
var result = collection.OrderByDescending(item => item.Cast<bool>().Count(i => i));

答案 1 :(得分:0)

我更喜欢这种方法,我认为这种方法更具可读性并且涵盖了更多用例:

class Program
{
    static void Main(string[] args)
    {
        List<bool[,]> boolList = new List<bool[,]>() {
        new bool[,] {
            {true,true,true,true},
            {true,true,true,true},
            {true,true,true,true}
        },
        new bool[,] {
            {false,true,true,true},
            {false,true,true,true},
            {false,true,true,true}
        }
        };

        boolList = OrderBoolArraysByBoolean(boolList, true);
    }

    private static List<bool[,]> OrderBoolArraysByBoolean(List<bool[,]> listOfArrays, bool value)
    {
        return listOfArrays.OrderByDescending(x => x.Cast<bool>().Count(i => i == value)).ToList();
    }
}