Как найти максимальное значение в столбце в datarow []? - PullRequest
4 голосов
/ 30 июля 2011

У меня есть простая проблема, но я просто не понимаю ни одного из примеров, которые я нахожу здесь или в MSDN. (Я все еще новичок в C # и всех функциях наборов данных).

У меня есть датируемый "tblRoom", его столбцы - "здание", "квартира" и "комната", и все они целые и первичные ключи таблицы (это слабая сущность квартиры (которая является слабой сущностью здания ) без других свойств / столбцов).

У меня также есть DataRow[] roomCollection, который выбирает конкретную квартиру в здании с этим кодом:

roomCollection = dbDataSet.tblRoom.Select("building ='"+ b_int + 
                                          "' and apartment='"+ a_int + "'");

Все это работает нормально (наверное ...). Теперь я хочу получить максимальную стоимость номера в этой квартире (максимальное количество номеров в этой квартире). Я пытался безрезультатно эти коды:

DataRow dr = roomCollection.Max();
int maxi = roomCollection.Max();

Я просто не понимаю из подсказки, что я должен написать в функции. Он генерирует исключения ни в IEnumerable, ни в Icomparable.

Что мне нужно написать, чтобы получить максимальное значение (int) в столбце комнаты? Любой знает «[что-то] для чайников», которое объясняет это идиоту, потому что я не понимаю значение ошибок / подсказок о том, что я должен написать в Max().

EDIT: Во всплывающей подсказке предлагается ввести эти (показанные релевантно):

(this IEnumerable <DataRow> source):DataRow
(this IEnumerable <DataRow> source, Func<DataRow,int?> selector):int?
(this IEnumerable <DataRow> source, Func<DataRow,int> selector):int

Я действительно не понимаю: (

Спасибо, Шей.

Ответы [ 3 ]

4 голосов
/ 30 июля 2011

1001 * попробовать *

int roomno = roomCollection.Max (r => (int) r["room"]);
1 голос
/ 30 июля 2011

Поскольку roomCollection является массивом DataRows, DataRow dr = roomCollection.Max(); означает выбор максимального значения DataRow из roomCollection. Но что значит для DataRow быть больше, чем другой DataRow? В общем, нет никакого полезного сравнения, поэтому .Max() не подходит для вас.

Технически DataRow не реализует IComparable, потому что есть общее полезное, зачем сравнивать два DataRow и указывать, какой из них «больше» или «меньше». Однако для целых чисел, поскольку 2 больше 1.

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

int max = roomCollection.Max(dr => (int)dr["room"]);

Это говорит о том, что для каждой DataRow выберите целочисленное значение для комнаты и получите максимальное значение для комнаты.

Функция .Max() является частью Linq (Language Integration Query), добавленного в .NET 3.5. Так что вам нужно прочитать об этом, чтобы лучше понять, что происходит. Я обнаружил, что 101 Linq Samples полезен, поскольку он показывает примеры практически для всех вещей, которые вы хотели бы сделать.

1 голос
/ 30 июля 2011

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

int max = roomCollection.Max(dr => (int)dr["room"]);
...