Сортировка списка 2D-массивов - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь отсортировать список, содержащий двумерные массивы bool, как показано ниже.

List<bool[,]>boolList;

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

Я пытался отсортировать список, в котором они находятся, по количеству истинных значений в каждом двумерном массиве.

После нескольких часов поиска и поиска по всему 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 голосов
/ 10 сентября 2018

Я предпочитаю такой подход, который я считаю более читабельным и охватывает больше случаев:

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();
    }
}
0 голосов
/ 10 сентября 2018

Сначала вы захотите узнать, как легко работать с массивом 2d и подсчитать количество true s в нем.Чтобы сделать это для одного элемента, вы можете сделать что-то похожее на то, что встречается в этом вопросе: Быстрый способ преобразования двумерного массива в список (одномерный)

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

Затем добавив OrderDescendingBy, вы получите желаемый результат:

var collection = new List<bool[,]> { bool2DArray, ... };
var result = collection.OrderByDescending(item => item.Cast<bool>().Count(i => i));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...