1

私は自分自身をLINQでかなり良いと思うのが好きですが、時々、私は仕事に就けない何かを成し遂げようとします。キーを使用して値を検索できるように、を辞書に変換したいSPListItemCollectionのですが、毎回LINQクエリを実行する必要はありません。

var formsConfigItems = new Dictionary<string, string>();
foreach (SPListItem item in list.GetItems(query))
    formsConfigItems.Add(item.Title, (item["Value"] == null ? string.Empty : item["Value"].ToString()));

これは機能しますが、LINQを使用してよりクリーンな方法で実行したいと考えていました。(大したことではありませんが、舞台裏では同じことですが、可能な限りforループでLINQを使用するのが好きです。

私はこのようなことをしようとしました:

var formsConfigItems = (from SPListItem i in list.GetItems(query)
                        select new { i.Title, i["Value"].ToString() }).ToDictionary<string, string>(k=>k.Key, k=>k.Value);

しかし、それはうまくいかないようです。でラムダ式を使用しようとすると、使用するlist.GetItems(query)オプション.WhereやLINQコマンドが表示されません(これは、であるため奇妙ですSPListCollection

前もって感謝します。

4

2 に答える 2

7

試す:

var formsConfigItems = list.GetItems(query)
                           .Cast<SPListItem>()
                           .ToDictionary(item => item.Title, 
                                         item => Convert.ToString(item["Value"]));

あなたの質問に答えるには:

list.GetItems(query)でラムダ式を使用しようとすると、.Whereまたは任意のlinqコマンド(SPListCollectionであるため奇妙です)を使用するオプションが表示されません。

これは、が実装されているが実装されていないSPListCollection「昔ながらの」コレクションであるため、C#/ LINQ(とにかくコンパイル時)は、含まれているアイテムの種類を認識できません。この呼び出しは、この問題を回避するのに役立ちます。これにより、がに変わり、コンパイル時に型代数が機能するようになります。ループ変数のタイプを明示的に指定するため、ループにはこの問題はありません。コンパイラーは、シーケンス内の各項目に対してユーザーに代わってキャストを挿入します。IEnumerableIEnumerable<T>Cast<SPListItem>()IEnumerableIEnumerable<T>for

私はこのようなことをしようとしました(クエリ式)。しかし、それはうまくいかないようです。

これは、匿名型インスタンスを正しく構築しておらず(任意の式のプロパティ名を推測できない)、ラムダ式も正しくないためです(使用するプロパティ名が匿名型のプロパティ名と一致しません)。 )。代わりにこれを試してください:

var formsConfigItems = (from SPListItem i in list.GetItems(query)
                        select new 
                        { 
                            i.Title, 
                            Value = Convert.ToString(i["Value"])
                        }).ToDictionary(a => a.Title, a => a.Value);
于 2013-03-08T14:57:42.213 に答える
2

Aniにはより優れたソリューションIMOがありますが、もう1つ欠けていることがあります。LINQステートメントは匿名アイテムのコレクションを作成していますが、その匿名クラスのプロパティに名前を付けていません。

式が機能しないのk=>k.Keyは、それが何であるかがわからないためKeyです。定義しただけですTitle(名前を付けなかったため、オブジェクトから名前を借用しました)。1Valueつは自動的に把握できないため、コンパイラエラーがスローされます。

このようにするには、名前を具体的に宣言する必要があります。

new { Key = i.Title, Value = i["Value"].ToString() }
于 2013-03-08T15:08:06.347 に答える