我目前正在使用正常循环来检查数字列表是否有序。
我目前正在学习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
}
}
}
}
答案 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等,它仍会认为有效。)