2012-05-30 6 views
0

Я создаю приложение C# 2010 с использованием .NET Framework 3.5.Сортировка с использованием библиотеки Linq библиотеки C#

У меня есть datagridview, который содержит несколько столбцов и строк [очевидно]. Я сохраняю эти строки datagridview в структуре формы List<string[]>. У меня также есть List<double>, который содержит коэффициенты. Я хочу сортировать структуру по коэффициентам, используя библиотеку System.LINQ. Я попытался следующее:

var linq_Query_rowrates = 
    from rw in rows 
    orderby matchrate descending 
    select rw; 

Это подчеркивает строки в запросе и показывает следующее сообщение об ошибке:

Error 1 Could not find an implementation of the query pattern for source type ' System.Collections.Generic.List<string[]> '. ' OrderByDescending ' not found. Are you missing a reference to ' System.Core.dll ' or a using directive for ' System.Linq '?

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

Примечание: Мне известно о многих других способах достижения этого, я просто заинтересован в этом, используя библиотеку LINQ.

Примечание: соответствие не является членом строк, но использование члена строк также не работает.

LATER EDIT: Может быть, это должно быть что-то вроде этого?

 var linq_Query_rowrates = 
      from rw in rows 
      join rate in matchrate 
      on matchrate equals rows 
      orderby matchrate descending 
      select rw; 
+4

Вы ссылаетесь на «Система».Core.dll 'и включил директиву 'using System.Linq;' в исходный файл? – dtb

+0

@dtb, да, я включил using System.Linq; и ссылаются на dll. –

+0

Как связаны строки и коэффициенты? По индексу? – clearpath

ответ

2

Это некрасиво, но это Linq:

  List<string[]> rows = null; 
      List<double> coefficients = null; 

      rows 
       .Select((row, index) => new { Row = row, Index = index }) 
       .Join(coefficients 
          .Select(
           (coefficient, index) => new { Coefficient = coefficient, Index = index }), 
           x => x.Index, 
           x => x.Index, 
           (rowIndex, coefIndex) => new { Row = rowIndex.Row, Coefficient = coefIndex.Coefficient }) 
       .OrderBy(x => x.Coefficient) 
       .Select(x => x.Row); 

Я не проверял, хотя. Должно быть возможно преобразовать его в форму запроса.

+0

Ужасно, как это было, он работал как шарм. Спасибо. –

+0

Мне нужно его сортировать по убыванию на самом деле. Как мне это сделать? –

+0

Заменить 'OrderBy'' OrderByDescending'. – jrummell

3

Предполагая matchrate является членом rw, вам нужно использовать следующий синтаксис:

var linq_Query_rowrates = 
    from rw in rows 
    orderby rw.matchrate descending 
    select rw; 

Update

В идеале, вы должны иметь свойство навигации для ваших отношений ставки, поэтому ваш запрос будет выглядеть так:

var linq_Query_rowrates = 
    from rw in rows 
    orderby rw.rate.matchrate descending 
    select rw; 

Другой вариант - выполнить соединение. Но соединения в LINQ уродливы, и я стараюсь их избегать.

+0

Это не член, но использование члена строк тоже не работает. –

+0

Вы не можете заказать что-то, что не является членом типа rw. – jrummell

+0

Хорошо, есть ли способ отсортировать строки по совпадению, используя только LINQ? –

2

Если ваша коллекция коэффициентов предназначена для ссылки на вашу коллекцию string [], почему вы строите 2 отдельных, несвязанных списка? Разумеется, было бы более просто построить очень простую структуру для хранения всей информации, чтобы обеспечить всегда подходящие коэффициенты для каждой строки. Это также делает сортировку очень простой.

public struct CoefficientRow 
{ 
    public double Coefficient; 
    public string[] Cells; 

    public CoefficientRow(double c, string[] cells) 
    { 
     this.Coefficient = c; 
     this.Cells = cells; 
    } 
} 

Сортировка становится ветер ...

List<CoefficientRow> rows = new List<CoefficientRow>(); 
//populate the list... 
var orderedRows = rows.OrderBy(cr => cr.Coefficient); 
//or 
var orderedRows = rows.OrderByDescending(cr => cr.Coefficient); 

Вставка их в DataGridView также по-прежнему довольно легко:

foreach(var row in rows) 
    this.dgvDataView.Rows.Add(row.Cells); 
1

Если бы вы могли использовать .Net4, ответ user676571 упрощает для :

IEnumerable<string> query = rows 
    .Zip(coefficients, (r, c) => new {row = r, coef = c}) 
    .OrderByDescending(x => x.coef) 
    .Select(x => x.row); 
+0

Не знал об этом - хороший. – clearpath

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