3

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

我目前正在学习 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
            }
        }
    }
}
4

2 回答 2

2

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

它只处理 form 的数字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();
}

诚实地?我认为你最好用一个循环。

于 2012-12-06T14:50:56.087 回答
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 等,它仍然认为是有效的。)

于 2012-12-06T14:28:45.343 回答