0

.NET Framework 3.5 を使用して C# 2010 アプリケーションを作成しています。

[明らかに]いくつかの列と行を含むデータグリッドビューがあります。この datagridview の行をフォームの構造に保存しますList<string[]>List<double>係数を含むもあります。System.LINQライブラリを使って構造を係数でソートしたい 。私は次のことを試みました:

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

これにより、クエリ内の行に下線が引かれ、次のエラーが表示されます。

エラー 1 ソース タイプ ' ' のクエリ パターンの実装が見つかりませんでしたSystem.Collections.Generic.List<string[]>。' OrderByDescending' が見つかりません。' 'への参照System.Core.dllまたは ' ' の using ディレクティブがありSystem.Linqませんか?

LINQ ライブラリを使用してこの種の構造をソートすることは可能ですか?

注:これを達成するための他の多くの方法を知っています.LINQライブラリを使用してそれを行うことに興味があります.

注: matchrate は行のメンバーではありませんが、行のメンバーを使用しても機能しません。

後で編集:多分それはこのようなものであるべきですか?

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

4 に答える 4

3

matchrateが のメンバーであると仮定するとrw、次の構文を使用する必要があります。

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

アップデート

理想的には、料金関係のナビゲーション プロパティがあるため、クエリは次のようになります。

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

もう 1 つのオプションは、結合を実行することです。しかし、LINQ での結合は醜いので、私はそれらを避けようとしています。

于 2012-05-30T13:07:57.907 に答える
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);
于 2012-05-30T14:02:52.473 に答える
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);

私はそれをテストしていません。それをクエリ形式に変換できるはずです。

于 2012-05-30T13:36:19.437 に答える
1

.Net4 を使用できる場合、user676571 の回答は次のように簡略化されます。

IEnumerable<string> query = rows
  .Zip(coefficients, (r, c) => new {row = r, coef = c})
  .OrderByDescending(x => x.coef)
  .Select(x => x.row);
于 2012-05-31T20:51:21.810 に答える