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
并不能清楚地表明这一点-抱歉。问题与演员阵容有关,因此尽管这可能会预先筛选出实际问题的答案是什么?