如何创建一个扩展方法,允许我调用ToSerializableDictionary(p => p.ID)而不是.ToDictionary(p => p.ID)

时间:2012-12-10 19:12:10

标签: c# extension-methods

我想创建一个扩展方法,允许我在以下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();
取自My SerializableDictionary class

here是我可以在我的webservice中序列化字典对象,以返回与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;

    }
}

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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);
    }
}

答案 2 :(得分: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中使用JSON.Net(或者可能是4?)。衷心推荐