2012-05-03 37 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