C# で IEnumerable<T> を List<T> に変換するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/31708

  •  09-06-2019
  •  | 
  •  

質問

LINQ を使用して汎用辞書をクエリし、その結果を ListView (WebForms) のデータソースとして使用しています。

簡略化されたコード:

Dictionary<Guid, Record> dict = GetAllRecords();
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo");
myListView.DataBind();

それはうまくいくと思いましたが、実際には System.InvalidOperationException:

ID が 'myListView' の ListView は、 データソースが ICollection を実装するか、 データ・ソースのページング (AllowPaging が 真。

それを機能させるために、次のことに頼る必要がありました。

Dictionary<Guid, Record> dict = GetAllRecords();
List<Record> searchResults = new List<Record>();

var matches = dict.Values.Where(rec => rec.Name == "foo");
foreach (Record rec in matches)
    searchResults.Add(rec);

myListView.DataSource = searchResults;
myListView.DataBind();

最初の例には、それを機能させるための小さな注意点はありますか?

(この質問のタイトルとして何を使用すればよいかわかりませんでした。より適切なものに自由に編集してください)

役に立ちましたか?

解決

これを試して:

var matches = dict.Values.Where(rec => rec.Name == "foo").ToList();

これは基本的に元の Values コレクションから新しいリストを作成することになるため、辞書への変更はバインドされたコントロールに自動的には反映されないことに注意してください。

他のヒント

私は新しい Linq 構文を使用することを好む傾向があります。

myListView.DataSource = (
    from rec in GetAllRecords().Values
    where rec.Name == "foo"
    select rec ).ToList();
myListView.DataBind();

キーを使用しないのに、なぜ辞書を取得するのですか?その諸経費を支払っているのです。

次のことも試してみてください。

var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo"));

基本的に汎用コレクションを直接キャストするのは非常に難しいため、新しいオブジェクトを作成する以外に選択肢はほとんどありません。

myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");

次の文に知識を追加するだけでは、de db からデータは回復されません。クエリを作成するだけです (クエリ可能なタイプであるため)。このクエリを起動するには、最後に .ToList() または .First() を追加する必要があります。

dict.Values.Where(rec => rec.Name == "foo")
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top