2013-02-01 69 views
0

我有一個數據列表,我想找到列表中相等的最長元素序列的長度。這對於集合上的循環很容易,但是我想知道是否有可以做到這一點的Linq查詢。謝謝你的幫助。您可以使用Linq查找集合中元素之間的關係嗎?

+8

粘貼與循環的代碼,我們不知道你的數據是什麼樣子.. –

+1

它不應該的問題,所有重要的是該元素類型支持相等比較。假裝它是一個整數列表。 – user200814

回答

1
var longest = list.Select((x,i) => list.Skip(i).TakeWhile(c => c == x).Count()).Max(); 
+1

請注意,你做了很多計數一遍又一遍不必要...當它可能是O(n)時,這是O(n^2)。如果這個問題給OP ... – Servy

+0

是的,對於大型列表,循環可能會快得多。 –

0

只是遍歷序列遞增計數器,當一個項目是等於先前和重置它,如果它不是。

public static int LongestSequence<T>(IEnumerable<T> source, IEqualityComparer<T> comparer) 
{ 
    comparer = comparer ?? EqualityComparer<T>.Default; 

    using (var iterator = source.GetEnumerator()) 
    { 
     if (!iterator.MoveNext()) //empty sequence 
      return 0; 
     T previous = iterator.Current; 
     int count = 1; 
     int maxCount = 1; 

     while (iterator.MoveNext()) 
     { 
      if (comparer.Equals(iterator.Current, previous)) 
      { 
       count++; 
      } 
      else 
      { 
       maxCount = Math.Max(maxCount, count); 
       count = 1; 
       previous = iterator.Current; 
      } 
     } 

     return maxCount; 
    } 
} 
相關問題