Максимальный массив C # - PullRequest
4 голосов
/ 29 мая 2010
  • У меня есть 2 массива с именами Arr1 и Arr2 в C #. Они имеют одинаковые размеры ...

Мне нужно получить элемент Arr1, соответствующий максимуму элементов в Arr2, начиная с заданных индексов ...

например
Получить максимальные индексы Arr2 [ 1 , 10 , 3 , i , j ] для всех i, j
Возврат Arr1 [ 1 , 10 , 3 , i , j ]

Конечно, мне нужно элегантное решение (а не "петля для них" ...)

Обратите внимание:
Я не хочу перебирать массивы, потому что он 11-мерный !! .. код будет уродливым и подверженным ошибкам .. и я могу исчерпать имена переменных:)

EDIT:
Нормальное решение будет:

for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
       if(Arr2[1,10,3,maxi,maxj]<Arr2[1,10,3,i,j])
       {
         maxi=i
         maxj=j
       }
 return Arr1[1,10,3,maxi,maxj];

Но мне нужно сделать это в меньшем и более красивом коде .. возможно, использую запросы или linq ..

Ответы [ 3 ]

1 голос
/ 01 июня 2010

Предполагая, что у вас должен быть 11-мерный массив (выполняя некоторую работу по М-теории?), И что никакая другая структура данных невозможна, и учитывая, что вы не хотите использовать циклы для поиска максимального значения в массив, который оставляет вам только одну возможность, о которой я могу думать:

Создайте новый класс ManagedArray с двумя закрытыми полями, одно для значений и одно для максимумов.
Создайте индексатор с 11 индексными параметрами. Получить так же просто, как все с 11 параметрами может быть:

        public int this[int index1, int index2, int index3, int index4, int index5, int index6, int index7, int index8, int index9, int index10, int index11]
        {
            get
            {
                return (int) values.GetValue( index1, index2, index3, index4, index5, index6, index7, index8, index9, index10, index11 );
            }

Набор вызовет SetValue, а затем обновит текущие максимумы новым значением, если новое значение больше существующего максимума для этого набора измерений.
Создайте свойство Maximum, которое принимает кучу значений индекса, чтобы оно возвращало текущее значение максимумов при этих значениях индекса. Теперь измените Arr1 и Arr2 на экземпляры класса ManagedArray.

Что мы сделали, так это обменяли цикл во время запроса (когда вы хотите узнать максимум) с немного более трудоемким установщиком массива, который отслеживает максимальные значения, чтобы мы могли искать их в постоянном времени, когда бы ни потребовался.

AFAIK, это единственный способ сделать это.

Обратите внимание, что с помощью ключевого слова params вы можете сделать его намного проще для чтения, но в этом случае установщик будет немного сложнее, когда вы обновляете максимумы. До вас.

0 голосов
/ 29 мая 2010

Как вы можете не перебирать все элементы, когда вам нужно вычислить максимальное значение?

По моему мнению, ваша жизнь станет проще, если вы поместите свои данные в более доступную структуру данных, по крайней мере, с поддержкой IEnumerable<T>.

0 голосов
/ 29 мая 2010

Я знаю, что это не очень поможет вам, но вы не можете использовать LINQ в этом случае, потому что многомерные массивы не реализуют интерфейс IEnumerable.

Так что не тратьте свое время на решение вашей проблемы с LINQ:)

...