2014-01-02 3 views
0

У меня есть словарьсловарь Фильтрация по диапазону Int в C#

Dictionary<int,Observation> 

, и я хочу, чтобы создать новый словарь с ключами в диапазоне от 1 до 10000, например.

Что у меня есть

Dictionary<int,Observation> source; 
Dictionary<int,Observation> newDict = new Dictionary<int,Observation>(); 
for (int i = 0; i < 10000; i++) 
{ 
    newDict[i] = new Observation(source[i]);   
} 

Есть ли эффективный способ создать новый словарь, который содержит только ключи, подходящие для данного диапазона (от Интс, конечно)?

Я новичок в LINQ, но я думаю, что есть способ сделать это.

+1

'Есть ли эффективный way', лань это означает, что код, который вы не эффективен? –

+0

Нет, код эффективен, но я хочу сделать его ellegant, экономя его эффективность. – Mockingbird

ответ

2

Использование Where (с любым условием вы хотите) и ToDictionary после

newDict = source.Where(x => x.Key < 10000 && x.Key > 10) 
             .ToDictionary(x=>x.Key,x=>x.Value); 
+1

Спасибо, он работает: dObservations = новый словарь (exIn.dObservations.Where (x => (x.Key <= iEnd && x.Key> = iStart)). ToDictionary (x => x. Ключ, х => x.Value)); – Mockingbird

4

Вы можете использовать Take Extension Method для этого:

var newDict = source.OrderBy(d => d.Key) 
        .Take(10000) 
        .ToDictionary(d=>d.Key,d=>d.Value); 

Также вы можете использовать Skip Extension method так:

var newDict = source.OrderBy(d => d.Key) 
        .Skip(1000).Take(10000) 
        .ToDictionary(d=>d.Key,d=>d.Value); 

Это будет Skip первые 1000 элементов затем Возьмите 10000 записей.

Или вы можете использовать Где получить определенный диапазон:

var newDict = source.Where(d => d.Key >= start && d.Key <= end) 
        .ToDictionary(d => d.Key,d => d.Value); 
+0

Спасибо. Но есть ли способ использовать 2 диапазона ints (iStart, iEnd) в этом запросе? – Mockingbird

+0

Я не уверен, но проверю мой ответ, возможно, может помочь вам –

+2

@ Selman22 Пропустить и принять возвратит 'IEnumerable >' не словарь :) – wudzik

0

Try:

var newDict=source.Keys.Where(c=> c >= rangeMinimum && c<=rangeMaximum).ToDictionary(c=>c,c=>source[c]); 

где rangeMinimum и rangeMaximum это начало и конец вашего диапазона. В вашем примере, 0 и 9999.

Смежные вопросы