将SortedDictionary的子集作为SortedDictionary获取

时间:2011-02-09 08:46:52

标签: c# linq

在C#中如何使用LINQ过滤SortedDictionary,生成一个也是SortedDictionary的子集?例如。我想写

SortedDictionary<int, Person> source = ..fetch..
SortedDictionary<int, Person> filtered = source.Where(x=>x.foo == bar)

我找到的唯一方法是创建一个帮助方法并使用

SortedDictionary<TKey, TValue> SubDictionary<TKey, TValue> IEnumerable<KeyValuePair<TKey, TValue>> l) 
{
    SortedDictionary<TKey, TValue> result = new SortedDictionary<TKey, TValue>();
    foreach (var e in l)
      result[e.Key] = e.Value;
    return result;
}

...

SortedDictionary<int, Person> source = ..fetch..
SortedDictionary<int, Person> filtered = SubDictionary(source.Where(x=>x.foo == bar))

1 个答案:

答案 0 :(得分:4)

如果您想要一个单一语句解决方案,这将有效:

SortedDictionary<int, Person> filtered = 
    new SortedDictionary<int, Person>(
        source.Where(x => x.Value.foo == bar)
              .ToDictionary(kvp => kvp.Key, kvp => kvp.Value));

但是,效率很低,因为它创建了两个字典对象(ToDictionary()扩展方法创建一个,然后传递给SortedDictionary构造函数。)

您的帮助方法将带来更好的性能。为了更清晰的语法,您可以将其作为IEnumerable&lt; KeyValuePair&lt; TKey,TValue&gt;&gt;的扩展方法:

public static class KeyValuePairEnumerableExtensions
{
    public static SortedDictionary<TKey, TValue> ToSortedDictionary<TKey, TValue>(
        this IEnumerable<KeyValuePair<TKey, TValue>> l)
    {
        SortedDictionary<TKey, TValue> result = new SortedDictionary<TKey, TValue>();
        foreach (var e in l) 
            result[e.Key] = e.Value;
        return result;
    }
}

可以这样使用:

var f2 = source.Where(x => x.Value.foo == bar).ToSortedDictionary();