2011-02-09 3 views
2

В C# как я могу фильтровать SortedDictionary, используя LINQ, создавая подмножество, которое также является SortedDictionary? Например. Я хотел бы написатьПолучение подмножества 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)) 

ответ

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 < < KeyValuePair TKey, TValue > >:

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(); 
Смежные вопросы