2012-05-03 33 views
2

我真的不知道列舉的列表,但經過一些研究後,我發現這個列表可能有助於解決我的問題。所以我在我的設置中有一個名爲strGrades的字符串,它是我手動更新的一系列字符串。範圍是0155-0160,0271-0388,0455-0503,0588-687。我基本上想要做的就是找到那些沒有在這個檔次列表中的值(例如0161,0389,0504-0587 ...)枚舉int列表<GradeRange>

於是我想出了一個功能,讓我拿到每場比賽在等級範圍:

public static List<GradeRange> GetValidGrades() 
{ 
    MatchCollection matches= Regex.Matches(Settings.Default.productRange, 
              Settings.Default.srGradeRange); 

    List<GradeRange> ranges= new List<GradeRange(); 

    if(matches.Count >0) 
    { 
     foreach (Match match in matches) 
     { 
      ranges.Add(new GradeRange() 23 { 
         Start= int.Parse(match.Groups["Start"].Value), 
         Stop= int.Parse(match.Groups["Stop"].Value) 
      });  
     } 

    } 
    return ranges; 
} 

這裏是等級範圍類

public class GrandRange 
{ 
    public int Start{get; set;) 
    public int Stop {get; set;) 
} 

所以上面的函數caputures我開始和結束的價值觀,任何人都可以請幫我進入一個榜單在哪裏可以找到超出範圍值的值,我只需要一個起點。非常感謝!

+0

範圍是否內插? – Andre

+0

你可以使用'Contains()'和滾動你自己的'IEqualityComparer'來執行你的檢查。 –

+0

你是如何從前面的範圍獲得0161,0389,0504-0587的? 0161剛好在0161之後,但爲什麼0162不包含在你預期的範圍內?爲什麼範圍起始數字前綴爲零?只是一個格式化的東西? – vidstige

回答

3

你可以沿着使用custom extension method that creates .BetweenWhere

var myFilteredList = list.Where(x=>!myValue.Between(x.Start, x.Stop, true)); 

這個心不是最高效的答案,但如果你需要的一切是不是一定範圍內的號碼列表,那麼你可以這樣做這樣的:

var missingNumbers = new List<int>(); 
var minStop = list.OrderBy(x=>x.Stop).Min().Stop; 
var maxStart = list.OrderBy(x=>x.Start).Max().Start; 
Enumerable.Range(minStop, maxStart).ToList() 
    .ForEach(x=> 
     { 
      if(!x.Between(x.Start, x.Stop, true)) 
       missingNumbers.Add(x); 
     } 
    ); 
+1

我認爲這不是OP想要的。我理解,(s)他想找到範圍之間的差距,而不是過濾列表 – Andre

+0

@Andre不是很漂亮或表演,但我更新了我的答案找出所有的差距 –

+0

我得到了範圍從a預設計算。是的,他們預先設置爲零格式。所以我會嘗試這個自定義擴展併發布我的結果。謝謝 – Naina

0

這裏本應該讓你開始

 var strings = "0155-0160, 0271-0388, 0455-0503, 0588-687"; 
     var splitStrings = strings.Split(char.Parse(",")); 
     var grads = new List<GrandRange>(); 
     foreach (var item in splitStrings) { 
      var splitAgain = item.Split(char.Parse("-")); 
      var grand = new GrandRange 
      { 
       Start = int.Parse(splitAgain[0]), 
       Stop = int.Parse(splitAgain[1]) 
      }; 
      grads.Add(grand); 
     } 

    } 
+0

好的,我用你的方法來獲取啓動和停止整數。謝謝,那麼現在如何通過開始和結束值來計算grads列表? – Naina

+0

我已經得到了啓動int和停止的方式,現在我該如何將這個範圍放到一個可枚舉的範圍中:Enumerable.Range(Stop,Start).ToList()?在每次啓動和停止int後,我在哪裏放置一個計數器?這是我卡住的地方,任何幫助將不勝感激。這是我第一次嘗試使用可枚舉的範圍,並且我正在嘗試獲得有關如何使用它們的工作示例。謝謝你們的幫助! – Naina