2011-08-26 85 views
0

我有一個任務來查找數組列表中最大的遞增繼承。LINQ列表數組問題

所以,如果我有陣列1 5 1 2 3 1 2

輸出必須是1 2 3

請幫我完成這個任務。

我可以用linq寫這個嗎?

+5

聽起來像是作業問題或面試問題。無論如何,你應該告訴我們你至少已經嘗試了一些東西。我們不是你的代碼猴子。 –

回答

1

是的,你可以使用linq做到這一點,但代碼是不是很可讀。使用循環更清晰的代碼。

var ind = 0; 
var result = ar.Select((i, index) => index > 0 ? new { Val = ar[index], ValIndex = ar[index] > ar[index - 1] ? ind : ++ind } : new { Val = ar[index], ValIndex = 0 }).GroupBy(t => t.ValIndex).Select(x => new { GroupKey = x.Key, Group = x }).OrderByDescending(g => g.Group.Count()).First(); 
foreach (var r in result.Group) 
{ 
    Console.WriteLine(r.Val); 
} 
+0

謝謝!這是最好的答案。 – Rejk

1

您想確定數組中幾個項目之間的關係,並按特定的順序。 Linq並不適合這一點,它更容易遍歷數組,檢測每個繼承的大小並記住最大的繼承。

2

由於這是一個家庭作業的問題,我不會給你一個完整的解決方案,但這裏有一些提示:

您需要遍歷號碼,並保持兩件事軌跡:

  • 當前增加序列的長度(最初爲0)和序列的最後一個數字(如果數字爲正數,最初爲-1)。例如,迭代1和5後,這兩個值將是2(長度)和5(最後一個數字)。

  • 到目前爲止發現的最佳序列的長度 - 例如,如果你在你的例子結束,當前序列具有長度2(最後兩個數字是1和2),但你先前發現長度爲3

序列就可以解決這個使用LINQ - 您可以使用Aggregate擴展方法來編寫保持當前狀態的迭代。然而,寫這個使用for循環將可能更容易(特別是如果你正在學習)

0

你可以寫一個這樣的方法:

IList<T> GetLongestIncreasingSequence<T>(IEnumerable<T> source) 
{ 
    var comparer = Comparer<T>.Default; 
    List<T> longest = null; 
    List<T> tmp = new List<T>(); 
    T previous = default(T); 
    bool first = true; 
    foreach (var item in source) 
    { 
     if (first || comparer.Compare(item, previous) > 0) 
     { 
      tmp.Add(item); 
     } 
     else 
     { 
      if (tmp.Any() && (longest == null || longest.Count < tmp.Count)) 
      { 
       longest = tmp; 
      } 
      tmp = new List<T>(); 
      tmp.Add(item); 
     } 
     first = false; 
     previous = item; 
    } 
    if (tmp.Any() && (longest == null || longest.Count < tmp.Count)) 
    { 
     longest = tmp; 
    } 
    return longest; 
} 

用法:

int[] values = { 1, 5, 1, 2, 3, 1, 2 }; 
var longest = GetLongestIncreasingSequence(values); 

這不是一個Linq的解決方案,但我不認爲有一種方便的方式來與Linq做...

+0

只是一個建議,而不是有一個臨時列表,保存每個序列的開始和結束,比較並保持最長的序列,並通過使用** GetRange **或**來檢索最長範圍。Skip() .Take()** ... – AJC