将整数列表转换为整数

7
这是一个有点奇怪的情况,我必须承认,但我正在尝试找到一种简洁而优雅的方法将 List<int> 转换为实际的 int。例如,如果我的列表包含条目1、2和3,则最终整数将为123。我想到的另一种方法是将数组转换为字符串,然后解析该字符串。有什么提示吗?

注意,您的列表内容必须产生有效的整数(即范围在-2,147,483,648到+2,147,483,647之间的整数)。 - Humberto
1
另外,如果你的列表是 { 100, 1, 0, 2 } 这样的,应该发生什么? - Humberto
在正常的生产应用中,您如何使用类似这样的东西? - Evan Plaice
@Evan:当我解析地址数据时,例如包含“13a”的门牌号码,我将整数弹出到列表中,直到遇到字符,然后将整数列表转换为实际的整数。虽然这对我来说是一个很好的测试,但后来我使用正则表达式来处理这个问题。 - Kieran Senior
@Kezzer 很有趣。以前从没听说过有人使用这种方法。 - Evan Plaice
显示剩余3条评论
6个回答

17

在遍历该列表时,就好像进行加法求和一样,但是在每个阶段将运行总数乘以10。

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

3
如果输入的数字不仅仅是个位数,会发生什么呢? 比如说: {1,3,15} 期望结果:1,315 实际结果:145 - RonK
@RonK。确实,它多了一位数字。问题是用单个数字呈现的,对于这种情况它可以工作,但需要更清楚地说明所需的结果,我同意。 - David M
很好地发现了RonK,如果是其他情况,这将是正确的。对我来说不是这样,因为我正在迭代字符数组,所以我认为这会起作用。午餐后测试。 - Kieran Senior

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

如果列表足够长,使得结果数字超过int的限制,那么你需要注意一下。


1
你能不能直接写成int.Parse(string.Join("", l)) - Kieran Senior

2

假设你有一个可枚举的对象,比如

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();

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
你可以通过循环将所有数字相加来实现。但不确定它是否比字符串解析更快:
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 的 BigInteger 类而不是 int。


0

仅供娱乐而已(我不知道这有多高效,可能不是很高),你也可以轻松地使用 Linq 来实现这个...

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接