2011-03-24 74 views
4

我有一些代碼,我在做一些奇怪的事情,從一個SortedList中獲取信息並返回到另一個SortedList。我做我的where子句,然後必須將所有KeyValuePairs分別放回到一個新的SortedList中。C#Linq SortedList篩選到SortedList

不能是做到這一點最有效率,或者確實是推薦的方式,但我似乎無法找到更好的方法。

下面是代碼:

SortedList<DateTime, CalendarDay> most_days = 
           new SortedList<DateTime, CalendarDay>(); 
List<KeyValuePair<DateTime, CalendarDay>> days = this.all_days.Where (
            n => n.Value.IsRequested || n.Value.IsApproved 
           ).ToList(); 
foreach (KeyValuePair<DateTime, CalendarDay> kvp in days) 
    most_days.Add(kvp.Key, kvp.Value); 

我如何能清理它(少即是多,因爲他們說的)任何想法?

感謝,

喬納森

回答

9

那麼你當然可以刪除ToList電話 - 這不是幫助你的。

你可以讓調用代碼是這樣簡單:

var dictionary = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved) 
         .ToDictionary(x => x.Key, x => x.Value); 
var mostDays = new SortedList<DateTime, CalendarDay>(dictionary); 

...那是要建立一箇中間Dictionary<,>,所以它幾乎沒有有效的。

另一種選擇是,你可以編寫自己的ToSortedList擴展方法,例如,

public static SortedList<TKey, TValue> ToSortedList<TSource, TKey, TValue> 
    (this IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector, 
    Func<TSource, TValue> valueSelector) 
{ 
    // TODO: Argument validation 
    var ret = new SortedList<TKey, TValue>(); 
    foreach (var element in source) 
    { 
     ret.Add(keySelector(element), valueSelector(element)); 
    } 
    return ret; 
} 

然後調用代碼也只是:

var mostDays = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved) 
         .ToSortedList(x => x.Key, x => x.Value); 

我猜想這應該是合理有效的,因爲它總是會增加值,在施工期間列表年底

(對於一個完整的工作,你要新增重載接受自定義鍵comparers等等看ToDictionary

+0

這就是爲什麼我喜歡這個網站。快速的答案哪些運作良好,哪些讓我覺得我學到了一些重要的東西。謝謝喬恩。 – Jonathan 2011-03-24 10:59:06

2

不是直接回答你的問題(對不起!) - 更多的是對這個問題的問題:

  • 您確實需要輸出爲SortedList嗎?
  • 或者你可以在輸出結果爲IEnumerable的情況下繼續存活,結果碰巧按正確順序排列?

如果你從來沒有打算讓你創建完成後,要添加/插入更多的項目mostDays集合,然後你可以明顯地只是創建一個IEnumerable使用var mostDays = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved);