2012-03-27 1 views
1

Я пытаюсь получить отличные значения из столбца с данными. Вот мой код ..Querying A Datable Использование Linq Возвращаемые отличительные значения

var sourceItems = ds.Tables[0].AsEnumerable() 
           .GroupBy(x => x.Field<string>("Source").ToString()) 
           .Select(x => x.First()); 
ddlSource.DataSource = sourceItems; 
ddlSource.DataBind(); 

Этот код возвращает 4 строки System.Data.DataRow в качестве значений. Мне нужны фактические значения, хранящиеся в строках, а не тип строки. Также является ли этот код подходящим способом захватить только отдельные значения в столбце?

ответ

4

Я хотел бы сделать что-то вроде этого:

var sourceItems = ds.Tables[0].AsEnumerable() 
           .Select(x => x.Field<string>("Source")) 
           .Distinct() 
           .ToList(); 

Обратите внимание, что .ToList() можно пропустить, но, конечно, это зависит от того, что DataSource свойства ddlSource объекта способно принять. Если это контроль winforms, то я подозреваю, что ToList необходим.

Ваш код в основном такой же, как этот, но вы должны изменить последний Select на Select(x => x.Key), чтобы выбрать значения, которые используются для группировки строк, а не для первой строки.
Также ваш код имеет больше накладных расходов, чем при использовании Distinct, так как GroupBy создает подгруппы в оригинальной коллекции.

+0

Добавлено разъяснение относительно вашего кода. – digEmAll

+0

Shabam! Спасибо! – cgatian

0

Почему вы не используете метод расширения .Distinct?

ds.Tables[0].AsEnumerable() 
    .Select(x => x.Field<string>("Source").ToString()) 
    .Distinct() 
    .FirstOrDefault(); 
0

Как насчет

var sourceItems = ds.Tables[0].AsEnumerable() 
         .Select(x => x.Field<string>("Source")) 
         .Distinct() 
         .ToList(); 
    ddlSource.DataSource = sourceItems; 
    ddlSource.DataBind(); 

(Вам не нужно звонить .ToString() на строку, поэтому я удалил это.)

+0

Это прекрасно работает, но когда я показываю его обратно в раскрывающемся списке, он по какой-то причине разбивает 1 символ для каждой строки. Должен ли я преобразовать исходные элементы в список или datable или что-то еще до того, как я установил его в источник данных? –

+0

@NickLaMarca есть пара возможностей. Вероятно, вызов .ToList() решит проблему. Я отредактировал код соответственно. – phoog

Смежные вопросы