我想创建一个扩展方法,允许我在以下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;
}
}
答案 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?)。衷心推荐