可能重复:
LINQ:如果字符串可解析为int ,则选择已解析的int
这可能是一个基本问题,但我想不出解决办法。我有一个字符串数组,我试图用整数来解析它们。不出所料,我得到了格式异常。
如何跳过"3a",继续解析剩余的数组,并使用Linq将整数存储到输出中。?这是一种更好的方法还是一种"不要做"的做法?请说明如何在这种情况下使用TryParse
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] values = { "1", "2", "3a","4" };
List<int> output = new List<int>();
try{
output = values.Select(i => int.Parse(i)).ToList<int>();
}
catch(FormatException)
{
foreach (int i in output)
Console.WriteLine(i);
}
foreach (int i in output)
Console.WriteLine(i);
Console.ReadLine();
}
}
}
您可以使用int.TryParse
string[] values = { "1", "2", "3a","4" };
int i = int.MinValue;
List<int> output = values.Where(s => int.TryParse(s, out i))
.Select(s => i)
.ToList();
演示
然而,埃里克·利珀特不会觉得好笑。因此,如果你不想(ab(使用副作用,这将是最佳实践方法:
创建一个扩展方法,如:
public static class NumericExtensions
{
public static int? TryGetInt(this string item)
{
int i;
bool success = int.TryParse(item, out i);
return success ? (int?)i : (int?)null;
}
}
然后你就可以写这个了:
List<int> output = values.Select(s => s.TryGetInt())
.Where(nullableInt => nullableInt.HasValue)
.Select(nullableInt => nullableInt.Value)
.ToList();
尽管我完全同意Tim Schmelter的回答中使用int.TryParse
,但我认为他的回答依赖于未记录的实现细节,更安全的替代方案可能是
List<int> output =
values
.Select(s => {
int i;
return int.TryParse(s, out i) ? i : default(int?);
})
.Where(i => i != null)
.Select(i => i.Value)
.ToList();
您可以将.Where(...).Select(...)
替换为.OfType<int>()
。
您还可以将第一个.Select(...)
lambda与显式可重用函数放在一起
int? MyTryParse(string s)
{
int i;
return int.TryParse(s, out i) ? i : default(int?);
}
List<int> output =
values
.Select(MyTryParse)
.Where(i => i != null)
.Select(i => i.Value)
.ToList();
linq版本来自Tim Schmelter 的答案
string[] values = { "1", "2", "3a", "4" };
int i = int.MinValue;
var output = (from c in values
where int.TryParse(c, out i)
select c).Select(s => int.Parse(s)).ToList();
foreach (var item in output)
{
Console.WriteLine(item.ToString());
}
为什么要使用LINQ?
试试这个:
foreach(string str in values)
{
int val;
if(int.TryParse(str, out val))
{
output.Add(val);
}
}
这个怎么样?受Tim答案的启发,但临时变量在循环中移动,因此它是并行安全的(假设字符串values
的集合是ParallelEnumerable(。
values.Select(s =>
{int i; return int.TryParse(s, out i) ? (int?)i : null;})
.Where(x=>x!=null).Select(x=>x.Value);
因此,给定["1", "two", "3"]
,它将返回[1,3]
List<string> output = values.Where(v => Regex.Match(v, "^(0|[1-9][0-9]*)$").Success)
.ToList();
示例使用Regex进行更多控制,以规定哪些值被视为有效。