LINQ验证大纲编号(1.1,1.2等)

时间:2012-12-06 13:59:05

标签: c# linq

我目前正在使用正常循环来检查数字列表是否有序。

我目前正在学习LINQ,我想知道如何在LINQ中实现以检查数字序列是否正确。

例如,我有一个序列号列表:

1.0
1.1
1.2
1.4
2.0

程序需要将第1.4行标记为错误,因为缺少1.3。

如何使用LINQ实现这一目标?

感谢您的帮助。 :)

这就像目录:

1.1后跟1.3无效,1后跟2有效。 1.4后跟2是有效的。

以下是我使用它的代码我认为还有很多失误:

using (System.IO.StreamReader reader = new System.IO.StreamReader("D:\\test.txt"))
{
    double prevNumber = 0;

    while (reader.Peek() >= 0)
    {
        double curNumber = double.Parse(reader.ReadLine());
        double x = Math.Round(curNumber - prevNumber, 1);

        if (x == 0.1)
        {
            prevNumber = curNumber;
        }

        else
        {
            int prev = (int)Math.Floor(prevNumber);
            int cur = (int)Math.Floor(curNumber);

            if ((cur - prev) == 1)
            {
                prevNumber = curNumber;
            }
            else
            {
                //error found
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

此方法采用文件名并返回错误版本的行号数组。对于您的示例,它返回{ 4 }

它只处理x.y形式的数字,因为它似乎是您想要处理的所有内容。

static int[] IncorrectLines(string filename)
{
    // Parse the file into an array of ints, 10* each version number.
    var ints =  File.ReadLines(filename)
        .Select(s => (int)(10 * decimal.Parse(s))).ToArray();
    // Pair each number up with the previous one.
    var pairs = ints
        .Zip(ints.Skip(1), (p, c) => new { Current = c, Previous = p });
    // Include the line numbers
    var withLineNos = pairs
        .Select((pair, index) => new { Pair = pair, LineNo = index + 2 });
    // Only keep incorrect lines
    var incorrect = withLineNos.Where(o => ! (         // not one of either:
            o.Pair.Current - 1 == o.Pair.Previous ||   // simple increment
            (o.Pair.Current % 10 == 0 &&               // major increment
             (o.Pair.Current / 10) - 1 == o.Pair.Previous / 10)
        ));
    return incorrect.Select(o => o.LineNo).ToArray();
}

诚实?我觉得你的循环更好。

答案 1 :(得分:1)

所以,如果我理解正确,你想循环一个排序的双精度列表(精确到一个小数位),并确定是否 - 如果整数的小数位存在 - 它们的区别不是大于0.1。

我们假设您的列表已排序:

List<double> contents = new List<double>() {1.0, 1.1, 1.2, 1.4, 2.0};

您可以在该列表中调用IsValid:

bool IsValid(List<double> contents) {
  //Get the distinct whole numbers
  var wholeNumbers = contents.Select(t => Math.Floor(t)).Distinct();
  foreach (var num in wholeNumbers) {

    //Get the "subcontents" for this whole number (chapter)
    var subContents = contents.Where(t => Math.Floor(t) == num).ToList();
    for (int i = 0; i < subContents.Count() - 1; i++) {

      //If the subcontents are different by something other than 0.1, it's invalid
      if (subContents.Count() > 1 && Math.Round(subContents[i + 1] - subContents[i], 1) != 0.1) {
        return false;
      }
    }
  }
  return true;
}

(请注意,如果子类别为1.14,1.24,1.34等,它仍会认为有效。)