2014-05-16 183 views
-2

我問了一個問題,前一段時間 - >how to count conditioned continuous values in a list with linq?如何用linq計算列表中的條件連續值? (Revized)

這個問題的回答@Fung。但是,我改變了這個問題的一些規則。新的條件:

var query = Enumerable.Range(0, 1440).Select((n, index) => 
    { 
     if ((index >= 480 && index <= 749) || (index >= 810 && index <= 999) || (index >= 1080 && index <= 1099) || (index>=1200 && index <= 1299)) 
      return 0; 
     else if ((index >= 750 && index <= 809) || (index >= 1100 && index <= 1199)) 
      return 1; 
     else 
      return 2; 
    }); 

所以,我能找到持續多少指標有「0」值,哪些是他們的指標 - 即使是「1」(而不是2)中斷 - ?例如;

query[480]=query[481]=query[482]....query[749] = 0, 
query[750]=query[751]...query[809] = 1, 
query[810]=query[811]....query[999] = 0, 
query[1000]?query[1001]...query[1079] = 2, 
query[1080]=query[1081]....query[1099] = 0, 
query[1100]=query[1101]....query[1199] = 1, 
query[1200]=query[1201]....query[1299] = 0, etc.. 

所以,答案是270(前1)+ 190(1後)= 460 雖然1080和1099之間具有索引0,它們不應該被認爲是因爲先前的值是 「2」。

此外,應該考慮從1080到1099和從1200到1299的值,因爲它們也有新的0 - 1 - 0系列。而且,這個系列應該被列入另一個列表。有沒有辦法做到這一點?

我現在已經這些結果: enter image description here

但是,因爲它由 「2」 分,我希望他們在另一個列表:enter image description here

回答

1
public class ListStuff 
{ 
    public int Count { get; set; } 
    public int Start { get; set; } 
    public int End { get; set; } 
    public int LType { get; set; } 
    public int Group { get; set; } 
} 


var query = Enumerable.Range(0, 1440).Select((n, index) => 
      { 
       if ((index >= 480 && index <= 749) || (index >= 810 && index <= 999) || (index >= 1080 && index <= 1099) || (index >= 1200 && index <= 1299)) 
        return 0; 
       else if ((index >= 750 && index <= 809) || (index >= 1100 && index <= 1199)) 
        return 1; 
       else 
        return 2; 
      }); 


     int typeCount = 0; 
     int groupCount = 0; 
     var result = query 
       .Select((x, i) => new 
       { 
        Value = x, 
        Index = i, 
        Group = (((i == 0 || (query.ElementAt(i - 1) == 2)) && x != 2) ? ++groupCount : groupCount) 
       }) 
       .GroupBy(x => 
        x.Index == 0 || x.Value != query.ElementAt(x.Index - 1) 
         ? ++typeCount 
         : typeCount) 
       .Select(x => new ListStuff() 
       { 
        Count = x.Count(), 
        Start = x.First().Index, 
        End = x.Last().Index, 
        LType = x.First().Value, 
        Group = x.First().Group 
       }) 
       .Where(x => x.LType == 0 || x.LType == 1) 
       .GroupBy(x => x.Group) 
       .ToList(); 
+0

不幸的是,事實並非如此。 – 1teamsah

+0

和問題是?所有的組都被標記... –

+0

我甚至編輯它使它分組和分裂成列表 –