2012-03-27 2 views
1

データ可能な列から異なる値を取得しようとしています。ここに私のコードは、このコードは、値としてSystem.Data.DataRowの4行を返すます。..異なる値を返すLinqを使用したDatableの照会

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

です。行の型ではなく行に格納されている実際の値が必要です。また、このコードは列内の別個の値だけを取得する適切な方法ですか?

答えて

4

私はこのようなものだろう:.ToList()はスキップすることができ、もちろん、それはddlSourceオブジェクトのDataSourceプロパティが受け入れることができるかに依存すること

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

注意を。それがwinformsのコントロールなら、私はToListが必要だと思う。

コードは基本的にはこのコードと同じですが、最後のSelectSelect(x => x.Key)に変更して、最初の行ではなく行をグループ化するために使用する値を選択する必要があります。
Distinctよりもオーバーヘッドが多いのは、GroupByが元のコレクションのサブグループを作成するためです。

+0

は、コードに関する説明を追加しました。 – digEmAll

+0

Shabam!ありがとうございました! – cgatian

0

.Distinct拡張方式を使用しないのはなぜですか?どの程度

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

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

(あなたが文字列に.ToString()を呼び出す必要はありませんので、私はそれを削除した。)

+0

これは正常に動作しますが、何らかの理由で各行に1文字ずつ表示しています。データソースに設定する前に、sourceItemをListやdatableなどに変換する必要がありますか? –

+0

@NickLaMarcaいくつかの可能性があります。おそらく.ToList()を呼び出すことで問題は解決します。私はそれに応じてコードを編集しました。 – phoog

関連する問題