【发布时间】:2013-10-06 03:35:12
【问题描述】:
鉴于此字符串值列表:
"12345"、"6789a"、"9876"、"23467b"
我们如何在 C# 中使用 Linq 语句来仅选择整数?换句话说,我们只想返回12345和9876。
【问题讨论】:
鉴于此字符串值列表:
"12345"、"6789a"、"9876"、"23467b"
我们如何在 C# 中使用 Linq 语句来仅选择整数?换句话说,我们只想返回12345和9876。
【问题讨论】:
您可以根据Int32.TryParse 方法的返回值过滤您的条目:
int temp;
list.Where(x => int.TryParse(x, out temp));
【讨论】:
temp 值的行为是一个未记录的实现细节,将来可能会改变。我更喜欢an extension。
temp 的最终值,上述解决方案仍然正确。可以将上述代码 sn-p 包含在专用语句块中以强制执行此操作。
将列表过滤为仅包含所有字符都是数字的字符串:
var filtered = list.Where(s => s.All(char.IsDigit));
另一种方法是使用int.TryParse 作为过滤函数,它在行为上有许多细微差别(关于有效整数的规则允许的不仅仅是数字,请参阅documentation)。
如果您希望将结果键入为整数,请使用 .Select(int.Parse) 跟进。
【讨论】:
int.TryParse 更有效。
int 的TryParse 方法是最可靠的指标,表明您有一个正确的数字。
像这样使用它:
int number = 0;
var selected = list.Where(x => int.TryParse(x, out number)).ToList();
【讨论】:
一种方式:
IEnumerable<int> ints = strings.Where(str => str.All(Char.IsDigit))
.Select(str => int.Parse(str));
这只会选择所有字符都是数字的字符串。然后它将它们解析为int。
更好的方法是使用这个扩展:
public static int? TryGetInt(this string item)
{
int i;
bool success = int.TryParse(item, out i);
return success ? (int?)i : (int?)null;
}
那么你可以使用这个查询:
IEnumerable<int> ints = strings.Select(str => str.TryGetInt())
.Where(nullableInt => nullableInt.HasValue)
.Select(nullableInt => nullableInt.Value);
【讨论】: