17

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 が true の場合にデータ ソースのページングを実行できるデータ ソースが必要です。

それを機能させるために、私は次のことに頼らなければなりませんでした:

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();

最初の例を機能させるための小さな落とし穴はありますか?

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

4

5 に答える 5

29

これを試して:

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

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

于 2008-08-28T05:23:15.067 に答える
9

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

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

キーを使用しないのに、なぜ辞書を取得するのですか? あなたはそのオーバーヘッドを支払っています。

于 2008-08-28T11:22:22.177 に答える
3

あなたも試してみてください:

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

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

于 2008-08-28T06:21:44.880 に答える
1
myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");
于 2008-08-28T05:23:30.807 に答える