2

我想创建一个扩展方法,允许我调用ToSerializableDictionary(p => p.ID)而不是.ToDictionary(p => p.ID)在以下 LINQ 上下文中调用。虽然我不确定我应该为哪个类创建一个扩展方法来替换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来完成这项任务——它工作得很好,使用起来非常简单,而且速度非常快。由于这些原因,我相信微软甚至已经转而在 MVC3(或者可能是 4?)中使用 JSON.Net。衷心推荐

于 2012-12-10T19:24:25.223 回答