我有一个数组:
string[] arr = new string[2]
arr[0] = "a=01"
arr[1] = "b=02"
我该如何取出这些数字并创建一个新数组来存储它们?我期望的是:
int [] newArr = new int[2]
在newArr内部,有2个元素,一个是'01',另一个是'02',均来自arr。
答案 0 :(得分:0)
获取一个子字符串,然后解析为int。
var newArr = arr.Select(x=>Int32.Parse(x.Substring(2))).ToArray();
答案 1 :(得分:0)
除了String.Split
之外,获得所需结果的另一种方法是在=
字符上使用=
。假设字符串将始终具有字母和数字格式,并用=
分隔,输入字符串中没有其他for (var i = 0; i < arr.Length; i++)
{
// Split the array item on the `=` character.
// This results in an array of two items ("a" and "01" for the first item)
var tmp = arr[i].Split('=');
// If there are fewer than 2 items in the array, there was not a =
// character to split on, so continue to the next item.
if (tmp.Length < 2)
{
continue;
}
// Try to parse the second item in the tmp array (which is the number
// in the provided example input) as an Int32.
int num;
if (Int32.TryParse(tmp[1], out num))
{
// If the parse is succesful, assign the int to the corresponding
// index of the new array.
newArr[i] = num;
}
}
个字符。
var newArr = arr.Select(x => Int32.Parse(x.Split('=')[1])).ToArray();
可以像其他答案一样在lambda表达式中将其缩短:
Int32.Parse
如果提供的字符串不是整数,则使用=
进行操作会导致异常。这还假定存在一个dplyr
字符,并且该字符的右边只有数字。
答案 2 :(得分:0)
正如其他答案所指出的,使用linq非常紧凑。 PM100写道:
var newArr = arr.Select(x=>Int32.Parse(x.Substring(2))).ToArray();
您问x是什么..那个linq语句在概念上等效于:
List<int> nums = new List<int>();
foreach(string x in arr)
nums.Add(Int32.Parse(x.Substring(2);
var newArr = nums.ToArray();
这并不完全相同,在内部linq可能不使用List,但是它体现了相同的概念-对于字符串数组中的每个元素(称为x),都将其切开,将结果解析为int ,将其添加到集合中,然后将集合转换为数组
有时我认为linq被过度使用;通过直接声明一个int数组的大小为字符串并直接填充它,而不是添加到List或其他集合(后来又转换为int数组)中,可能会获得效率。可以很容易地找到两种风格的支持者。 linq是紧凑的,并且可以处理相对较长的手工构造,例如循环内循环。尽管对于那些不熟悉其阅读方法的人来说不一定很容易解决,但是它确实带来了一定的自我记录方面的代码,因为它使用诸如Any,Where,Distinct之类的英语单词,并且比看循环代码更能传达概念。当测试返回true(Any)或从所有元素构建字典/哈希集并返回(Distinct)时,退出较早