C# 读取每行总和的代码可以工作,但需要忽略非整数值,并且仍然有一些是总和。我还需要找到总计
我有以下代码,但我需要帮助使代码忽略一行中的非整数值。当前,它计算每行的总和,但如果在遇到非整数值时停止计算。还有,我怎样才能得到所有行的总计 我的输入文件如下所示 50,22,30,10,50,5,40 25,10,10,46,16,17,90 15,c80x,2 x、 2,3, 公共课程 { 尝试使用Linq,您的任务是Linq设计用于:C# 读取每行总和的代码可以工作,但需要忽略非整数值,并且仍然有一些是总和。我还需要找到总计,c#,C#,我有以下代码,但我需要帮助使代码忽略一行中的非整数值。当前,它计算每行的总和,但如果在遇到非整数值时停止计算。还有,我怎样才能得到所有行的总计 我的输入文件如下所示 50,22,30,10,50,5,40 25,10,10,46,16,17,90 15,c80x,2 x、 2,3, 公共课程 { 尝试使用Linq,您的任务是Linq设计用于: using System.Linq; ... public static void Main(string[] args) {
using System.Linq;
...
public static void Main(string[] args) {
var result = File
.ReadLines(@"InputData.txt")
.Select(line => line
.Split(new char[] { ',', ';'}, StringSplitOptions.RemoveEmptyEntries)
.Select(item => {
int v;
bool parsed = int.TryParse(item, out v);
return new {
value = v,
isParsed = parsed,
};
})
.Where(item => item.isParsed)
.Sum(item => item.value));
int lineIndex = 0;
long grandTotal = 0;
foreach (var sum in result) {
Console.WriteLine(
$"The sum of the numbers entered at line {lineIndex + 1} is: {sum}");
lineIndex += 1;
grandTotal += sum;
}
Console.Write($"Grand total is {grandTotal}");
}
您可以使用
TryParse
而不是Parse
。您可以更改此部分
numbers.Trim().Split(',').Select(int.Parse).ToArray()
……为此:
numbers.Trim().Split(',')
.Select(text => {
int result;
bool isNumeric = Int32.TryParse(text, out result);
return new { result, isNumeric };
})
.Where(entry => entry.isNumeric)
.Select(entry => entry.result)
.ToArray()
最好使用
int.TryParse()
插入:
theList = numbers.Trim().Split(',').Select(int.Parse).ToArray();
使用:
string[]list=numbers.Trim().Split(',');
列表列表=新列表();
foreach(列表中的字符串项)
{
int结果;
if(int.TryParse)(输出结果)
{
添加(结果);
}
}
也不要抛出任何异常(将else留空),因为如果它再次进入else,将停止循环。我非常喜欢这个问题,因为它充分利用了我的标准库方法之一
因此,让我们首先从防止字符串不是有效数字时出现异常开始
public static class IntExt
{
public static int? ParseNullable(string text)
{
int result;
return int.TryParse(text, out result) ? result : (int?)null;
}
}
当字符串不是数字时,此方法返回null。这非常容易查询。因此,我们只需运行一个简单的LINQ查询即可获得答案
var result = numbers.Trim().Split(',').Sum(x => IntExt.ParseNullable(x) ?? 0);
在上面的代码部分中,我只想指出,??0
表示“或if null返回0”。这是C#6中的一个新运算符
最后,我们只需要理清界线
int total;
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
while ((currentLine = streamReader.ReadLine()) != null)
total += currentLine.Trim().Split(',').Sum(x => IntExt.ParseNullable(x) ?? 0);
//total now contains the grand total
您的输入文件看起来像什么?@px06立即检查Select(item=>int.Parse(item)
在语义上与OP的Select(int.Parse)相同
。由于StringSplitOptions.RemoveEmptyEntries
只删除空条目,而不删除非整数条目,所以问题仍然没有解决。@Sefe:我明白了,谢谢!没有注意到编辑问题。
var result = numbers.Trim().Split(',').Sum(x => IntExt.ParseNullable(x) ?? 0);
int total;
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
while ((currentLine = streamReader.ReadLine()) != null)
total += currentLine.Trim().Split(',').Sum(x => IntExt.ParseNullable(x) ?? 0);
//total now contains the grand total