2010-06-14 106 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(); 
相關問題