Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从文件中读取整数的简单方法_C#_Linq_Casting - Fatal编程技术网

C# 从文件中读取整数的简单方法

C# 从文件中读取整数的简单方法,c#,linq,casting,C#,Linq,Casting,我试图读入一个文件,它本质上是一个整数列表,用一行分隔。显然,文件输入永远不可信,所以我需要过滤掉非整数 一, 二, 三, 四, 我知道as运算符通常会进行转换(如果可以的话),然后分配null,但是因为int不可为null,所以情况并非如此。我想也许我可以强制转换为Nullable。我从未真正深入研究过这一点,我想也许我能做到: var lines = File.ReadAllLines(""); var numbers = lines.Select(line => line as

我试图读入一个文件,它本质上是一个整数列表,用一行分隔。显然,文件输入永远不可信,所以我需要过滤掉非整数

  • 一,
  • 二,
  • 三,
  • 四,
我知道
as
运算符通常会进行转换(如果可以的话),然后分配null,但是因为
int
不可为null,所以情况并非如此。我想也许我可以强制转换为
Nullable
。我从未真正深入研究过这一点,我想也许我能做到:

var lines = File.ReadAllLines("");
var numbers = lines.Select(line => line as int?).Where(i => i != null);
我知道我可以通过做以下事情来解决这个问题:

var numbers = lines.Select(line =>
                                  {
                                    int iReturn = 0;
                                    if (int.TryParse(line, out iReturn ))
                                      return iReturn;
                                    else
                                      return null;        
                                  }).Where(i => i != null);
我还可以将其作为一种扩展方法

我只是在寻找一种简洁明了的方式来进行语句中的转换,并理解为什么我的代码无效。

不。C#在将字符串更改为数字时故意保持谨慎

您可以使用foreach循环使代码更短(不再为null)

var numbers = new List<int>();

foreach(string line in lines)
{
    int n;
    if (int.TryParse(line, out n))
        numbers.Add(n);
}
var number=新列表();
foreach(行中的字符串行)
{
int n;
if(内锥巴色(线,外n))
编号。添加(n);
}

没有一种简洁的方法可以做到这一点,因为在这里您不需要强制转换(您不能强制转换)——您需要从一种类型转换为另一种类型。当然,类型是
int
string
(因此不完全是“任何”类型),但在一般情况下,不相关类型之间的任何转换都不能“像那样”完成。

我总是使用这种简单的扩展方法:

public static int? TryGetInt(this string item)
{
    int i;
    bool success = int.TryParse(item, out i);
    return success ? (int?)i : (int?)null;
}
public static class Int32Extensions
    {
        public static int? ParseOrDefault(this string text)
        {
            int iReturn = 0;
            if (int.TryParse(text, out iReturn))
            {
                return iReturn;
            }
            return null;
        }
    }
那么很容易:

 var numbers = lines.Select(line => line.TryGetInt())
                    .Where(i => i.HasValue)
                    .Select(i => i.Value);
您也可以在不使用扩展名的情况下使用
int.TryParse
,但该扩展名没有文档记录,因此将来可能会停止工作:

int i = 0;
var numbers = lines.Where(line => int.TryParse(line, out i))
                   .Select(line => i);
编辑

“还了解我的代码无效的原因”

相关代码:

if (int.TryParse(line, out iReturn ))
  return iReturn;
else
  return null;   
如果你换个新的就行了

else
    return null;


因为您返回的是
int
,但是
null
不能隐式转换为
int

,所以您可以创建和扩展方法

public static int? ToInt(this string s, int default){  ... }
并在LINQ中使用它:

var lines = File.ReadAllLines(path); 
var numbers = lines.Select(line => line.ToInt())
                   .Where(i => i != null);

如果我理解正确,你只想过滤非整数行,也许正则表达式是一个选项

var lines = File.ReadAllLines("");
var numbers = lines.Where(i => Regex.IsMatch(i, "[0-9]+"));

以下是我想到的最好的:

使用此扩展方法:

public static int? TryGetInt(this string item)
{
    int i;
    bool success = int.TryParse(item, out i);
    return success ? (int?)i : (int?)null;
}
public static class Int32Extensions
    {
        public static int? ParseOrDefault(this string text)
        {
            int iReturn = 0;
            if (int.TryParse(text, out iReturn))
            {
                return iReturn;
            }
            return null;
        }
    }
像这样:

var query = lines.Select(x => x.ParseOrDefault()).Where(x => x.HasValue);

不。C#故意对这类事情保持谨慎。@Colonnelpanic可能是这样,但如果我告诉你,它可能是空的,这不是大声说的吗?这与将
Foo对象
强制转换为
条形对象
之间有什么区别?此外,如果要防止恶意输入,则应使用枚举器(或等效功能)替换文件。ReadAllLines(…)调用,该枚举器可按顺序读取行并验证行,我编辑了标题,因为这个问题得到了很好的答案,而这并没有回答原来的问题@卢克亨纳利:你的术语是错误的,所以你应该仔细检查你的事实<代码>foo as Bar
不是装箱;装箱是将值类型放入
对象时发生的情况<代码>字符串
不能强制为任何类型——“强制”应该是什么意思?@LukeHennerley:一般来说,不装箱/取消装箱的强制转换在运行时不会更改任何内容。他们改变的是编译器在编译过程中的簿记信息。抱歉,哈哈,自从我接受培训后就没有使用过这个术语:P但谢谢你帮我清理这个问题,+1。我想筛选是,但我想返回
int[]
,显然,
var
并不能清楚地表明这一点-抱歉。问题与演员阵容有关,因此尽管这可能会预先筛选出实际问题的答案是什么?