2

次のLINQコンテキストではToSerializableDictionary(p => p.ID)なく、呼び出すことができる拡張メソッドを作成したいと思います。.ToDictionary(p => p.ID)置換するための拡張メソッドを作成することになっているクラスはわかりませんがToDictionary<T>

response.attributes = (
    from granuleGroup in groups
    let granuleRow = granuleGroup.First().First()
    select new USDAttributes()
    {
        id = (int)granuleRow["id"],
        ...
        attributes =
        (
            ...
        ).ToDictionary(p => p.ID) <--** LINE IN QUESTION **
    }
).ToList();

ここから取得したSerializableDictionaryクラスは、Webサービスのディクショナリオブジェクトをシリアル化して、JSONで適切に機能するハッシュテーブルを返すためのものです。

最初はIDictionaryの拡張メソッドを作成していたので、次のようなことができます。...).ToDictionary(p => p.ID).ToSerializableDictionary();しかし、拡張メソッドを作成するのは初めてで、何をしているのかわからないため、これは完全な失敗です。

public static class CollectionExtensions
{

    public static SerializableDictionary<string, object> ToSerializableDictionary(this IDictionary<string,object> sequence)
    {

        SerializableDictionary<string, object> sDic = new SerializableDictionary<string, object>();


        foreach (var item in sequence)
        {

        }

        return sDic;

    }
}
4

3 に答える 3

6
public static SerializableDictionary<TKey, T> ToSerializableDictionary<TKey, T>(this IEnumerable<T> seq, Func<T, TKey> keySelector)
{
    var dict = new SerializableDictionary<TKey, T>();
    foreach(T item in seq)
    {
        TKey key = keySelector(item);
        dict.Add(key, item);
    }

    return dict;
}
于 2012-12-10T19:16:06.067 に答える
3

実際、提供したクラスにはこれを行うための便利なコンストラクターがあるため、実際に行うことができます

attributes = new SerializableDictionary( (
        ...
    ).ToDictionary(p => p.ID) );

しかし、ここでは拡張メソッドを使用します(ここでもそのコンストラクターを使用します)。

public static partial class Extension {
    public static SerializableDictionary<T, Q> ToSerializableDictionary(
        this IDictionary<T, Q> d) {

        return new SerializableDictionary(d);
    }
}
于 2012-12-10T19:18:36.877 に答える
2

Leeの回答は正解ですが、別のアプローチを提供するために、この少し簡潔なバージョンを試すことができます。

public static SerializableDictionary<TKey, T> ToSerializableDictionary<TKey, T>(this IEnumerable<T> seq, Func<T, TKey> keySelector)
{
    var dict = seq.ToDictionary(keySelector);

    //since SerializableDictionary can accept an IDictionary
    return new SerializableDictionary<TKey, T>(dict);

}

ただし、個人的には、さらに単純なアプローチを検討し、このタスクにJSON.Netを使用します。これは完全に機能し、途方もなく簡単に使用でき、信じられないほど高速です。これらの理由から、MicrosoftはMVC3(またはおそらく4?)でJSON.Netの使用に切り替えたと思います。心からお勧めします

于 2012-12-10T19:24:25.223 に答える