2

我真的对枚举列表一无所知,但经过一些研究,我发现这个列表可能有助于解决我的问题。所以我的设置中有一个名为 strGrades 的字符串,它是我手动更新的一系列字符串。范围为 0155-0160、0271-0388、0455-0503、0588-687。我基本上想要做的是找到不在这个成绩列表中的值(例如0161,0389、0504-0587 ...)

所以我想出了一个函数,可以让我在年级范围内获得每场比赛:

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; )
}

所以上面的函数捕获了我的开始和结束值,任何人都可以帮我把它放到一个列表中,在那里我可以找到超出范围值的值,我只需要一个起点。非常感谢!

4

2 回答 2

3

您可以使用创建 .Between 的自定义扩展方法以及Where

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);
        }
    );
于 2012-05-03T14:47:40.217 回答
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);
        }

    }
于 2012-05-03T14:52:28.610 回答