92


3

LINQを使用してDataTableから個別の名前付きリストを取得する方法を教えてください。

Name`カラムを持つ DataTable`があります。 アルファベット順に並べられた一意の名前のコレクションを生成したいです。 次のクエリは、_order by_句を無視します。

var names =
    (from DataRow dr in dataTable.Rows
    orderby (string)dr["Name"]
    select (string)dr["Name"]).Distinct();

なぜ `orderby`が強制されないのですか?

7 Answer


53


問題は、Distinct演算子が、元の値の順序を維持することを許可していないことです。

だからあなたのクエリはこのように動作する必要があります

var names =(dataTableのDataRow drから。select(string)dr ["Name"]を選択します。)Distinct()。OrderBy(name => name);


32


読みやすく保守しやすくするために、複数のLINQステートメントに分割することもできます。

  1. まず、データを新しいリストに選択し、 `x1`と呼びましょう。 必要に応じて投影

  2. 次に、 x1`から x2`に別のリストを作成します。 必要な区別

  3. 最後に、 x2`から x3`に並べ替えられたリストを作成します。 あなたが望むものは何でも


8


var sortedTable =(resultTable.AsEnumerable()の結果からselect(string)results [attributeList])Distinct()。OrderBy(name => name);


5


以下を試してください。

dataTable.Rows.Cast()。select(dr => dr ["Name"]。ToString())。Distinct()。OrderBy(name => name);


1


以下を試してください

var names =(dataTableのdrから。select(string)dr ["Name"]を選択します。)Distinct()。OrderBy(name => name);

これはあなたが必要とするもののために働くべきです。


0


要約すると、すべての答えに共通点があります。

OrderByが最後の操作です。


0


あなたはそのようなものを使うことができます:

dataTable.Rows.Cast()。GroupBy(g => g ["Name"])。(s => s.First())。OrderBy(o => o ["Name"]);を選択します。