C# 读取每行总和的代码可以工作,但需要忽略非整数值,并且仍然有一些是总和。我还需要找到总计

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) {

我有以下代码,但我需要帮助使代码忽略一行中的非整数值。当前,它计算每行的总和,但如果在遇到非整数值时停止计算。还有,我怎样才能得到所有行的总计

我的输入文件如下所示

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) {
     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