2010-02-23 24 views
0

我正在玩QuickSort和LINQ,並希望將序列分成項目之前,等於和之後的樞軸。什麼是最好的LINQ方法來過濾一個關鍵點的序列?

這是我到目前爲止有:

public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> ComparativeWhere<T>(this IEnumerable<T> source, T t) 
     where T : IComparable<T> 
    { 
     return new Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>>(
      source.Where(x => x.CompareTo(t) < 0), 
      source.Where(x => x.CompareTo(t) == 0), 
      source.Where(x => x.CompareTo(t) > 0) 
      ); 
    } 

什麼是做到這一點的最好方法是什麼?這是最好的實施,還是有更好的?或者我應該使用我不知道的庫函數?

+0

你應該使用'OrderBy'。 – SLaks 2010-02-23 16:10:35

+0

是的,我相信'OrderBy'是排序的最佳方式。我實際上正試圖在這裏實現'QuickSort'。 – 2010-02-23 16:21:56

+0

我認爲是這樣的...... – SLaks 2010-02-23 16:54:21

回答

0

如果性能是一個問題(和排序它的時候通常是,儘管這只是爲了好玩),我會建議可能不使用內置的東西,因爲你這樣做的方式,是你的調用Where 3次,這導致枚舉被迭代3次。我只是這樣做:

public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> ComparativeWhere<T>(this IEnumerable<T> source, T t) 
where T : IComparable<T> 
{ 

    var list1 = new List<T>(); 
    var list2 = new List<T>(); 
    var list3 = new List<T>(); 

    foreach (var item in source) 
    { 
     if (item.CompareTo(t) < 0) 
     { 
      list1.Add(item); 
     } 

     if (item.CompareTo(t) == 0) 
     { 
      list2.Add(item); 
     } 

     if (item.CompareTo(t) > 0) 
     { 
      list3.Add(item); 
     } 
    } 

    return new Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>>(list1, list2, list3); 
} 

當然的兩個缺點這種方法是,你要創建3個新的列表,它不再懶洋洋地執行,但生活中的一切是一個權衡是不是? :)

相關問題