2010-06-14 104 views
6

这是一个我必须承认的奇怪情况,但我试图找到一个简洁而优雅的方式将List<int>转换为实际的int。例如,如果我的列表包含条目1,2和3,那么最终的整数将是123.我唯一想到的做法是将数组转换为字符串,然后解析字符串。将Int列表转换为Integer

任何提示?

+0

当心,你的列表中的内容必须出示有效的int(即整数在-2,147,483,648到+2,147,483,647的范围内)。 – Humberto 2010-06-14 11:42:33

+1

另外,如果您的列表类似{100,1,0,2},应该发生什么? – Humberto 2010-06-14 11:43:36

+0

如果列表包含大于等于10的值,那么规则是什么?例如1,20,33,4会变成120334?如果是这样,下面的“10的倍数”答案将失败。 – 2010-06-14 11:43:48

回答

14

迭代列表,好像添加一个总和,但在每个阶段将运行总数乘以10。

int total = 0; 
foreach (int entry in list) 
{ 
    total = 10 * total + entry; 
} 
+3

如果条目不是单个数字会怎么样? 可以说: {1,3,15} 预期结果:1,315 实际结果:145 – RonK 2010-06-14 11:44:09

+0

@RonK。诚然,它带有额外的数字。这个问题是用单个数字来表示的,它的工作原理,但是我需要更清晰的表达我期望的结果。 – 2010-06-14 11:57:27

+0

在任何其他情况下,RonK都会发现这是真的。对我来说,这不是因为我正在迭代字符数组,所以我认为这将起作用。午餐后会测试。 – Kezzer 2010-06-14 11:58:45

1

我觉得你的建议是相当不错的,像这样的工作:

var list = new List<int>() { 1, 2, 3, 4 }; 
var listAsString = String.Join("", list.ConvertAll(x => x.ToString()).ToArray()); 
Console.WriteLine(listAsString); 
int result = Int32.Parse(listAsString); 
Console.WriteLine(result); 
+0

dangit击败了我。 – Will 2010-06-14 11:57:46

2
List<int> l = new List<int>(); 
// add numbers 
int result = int.Parse(string.Join(",", l).Replace(",", "")) 

你必须照顾,如果列表足够长,这样得到的数字将超过int的限制尽管如此。

+1

难道你不能只是'int.Parse(string.Join(“”,l))'? – Kezzer 2010-06-14 13:33:20

0

您可以通过在循环中添加所有数字来实现。不知道这是不是字符串分析,虽然速度快:

List<int> list = new List<int> {1, 2, 3}; 
int sum = 0; 
int pow = list.Count - 1; 
for (int i = 0; i <= pow; i++) 
{ 
    sum += list[i] * (int)Math.Pow(10,(pow-i)); 
} 

此外,如果有一个长长的清单,你可能需要使用.NET 4.0的BigInteger的类,而不是一个int。

0

好吧只是为了好玩(我不知道这是怎么effecient是,可能不是很),你也可以做到这一点很容易地使用LINQ ...

第一整数列表转换为字符串列表,然后使用聚合函数来连接它们,然后在最后使用in32.TryParse来确保结果值在int范围内。

string val = ints.Select(i=> i.ToString()).Aggregate((s1, s2) => s1 + s2); 
0

说,你有一个像

var digits = [1, 2, 3 ...]; 

可枚举的,那么你可以这样做:

// simplest and correct way; essentially the accepted answer but using LINQ 
var number = digits.Aggregate((a, b) => a * 10 + b); 

// string manipulation; works for sets like [10, 20, 30] 
var number = int.Parse(string.Join("", digits)); 

// using `Select` instead of `Aggregate` but verbose; not very useful 
var number = (int)digits.Select((d, i) => d * Math.Pow(10, digits.Count() - i - 1)).Sum();