2010-06-14 16 views
6

यह एक अजीब मामला है जिसे मुझे स्वीकार करना होगा, लेकिन मैं List<int> को वास्तविक int में परिवर्तित करने का एक संक्षिप्त और सुरुचिपूर्ण तरीका ढूंढने की कोशिश कर रहा हूं। उदाहरण के लिए, यदि मेरी सूची में प्रविष्टियां 1, 2, और 3 शामिल हैं, तो अंतिम पूर्णांक 123 होगा। एकमात्र अन्य तरीका जिसे मैंने ऐसा करने के बारे में सोचा था, सरणी को एक स्ट्रिंग में परिवर्तित कर रहा था और फिर स्ट्रिंग को पार्स कर रहा था।इंटीजर में इंट्रास्ट सूची बदलें

कोई संकेत?

+0

खबरदार है कि अपनी सूची की सामग्री को एक वैध पूर्णांक (एक पूर्णांक का उत्पादन होगा कि है, श्रेणी -2,147,483,648 में +2,147,483,647 के माध्यम से)। – Humberto

+1

इसके अलावा, यदि आपकी सूची {100, 1, 0, 2} जैसी कुछ है तो क्या होगा? – Humberto

+0

यदि आपकी सूची में मूल्य> = 10 है तो नियम क्या है? जैसे 1, 20, 33, 4 120334 बन जाएगा? यदि ऐसा है, तो नीचे दिए गए "10 के गुणक" उत्तर विफल हो जाएंगे। –

उत्तर

14

सूची जोड़ना, जैसे कि योग जोड़ना, लेकिन प्रत्येक चरण में रनिंग कुल 10 से गुणा करें।

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

क्या होगा यदि प्रविष्टियां एकल अंक नहीं हैं? आइए कहें: {1,3,15} अपेक्षित परिणाम: 1,315 वास्तविक परिणाम: 145 – RonK

+0

@RonK। सच है, इसमें अतिरिक्त अंक है। समस्या को एकल अंकों के साथ प्रस्तुत किया गया था, जिसके लिए यह काम करता है, लेकिन वांछित परिणाम पर मैं अधिक स्पष्टता की आवश्यकता है। –

+0

अच्छी तरह से रोना देखा, किसी भी अन्य मामले में यह सच होगा।मेरे लिए ऐसा नहीं है क्योंकि मैं एक चरित्र सरणी पर पुनरावृत्ति कर रहा हूं, इसलिए मुझे लगता है कि यह काम करेगा। दोपहर के भोजन के बाद परीक्षण करेंगे। – Kezzer

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

मुझे पंच को हराया। – Will

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

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

इसके अलावा, अगर आप एक लंबी सूची है, तो आप एक पूर्णांक के बजाय नेट 4 की BigInteger वर्ग का उपयोग करना चाहते हो सकता है।

0

खैर सिर्फ मनोरंजन के लिए, आप भी यह आसानी से Linq साथ

कर सकते हैं ... पहली स्ट्रिंग की एक सूची के लिए ints की सूची परिवर्तित (मुझे पता नहीं कैसे कुशल यह बहुत है, शायद नहीं है), फिर समेकित फ़ंक्शन का उपयोग उन्हें संयोजित करने के लिए करें, फिर अंत में 3232 का उपयोग करें। यह सुनिश्चित करने के लिए कि परिणामस्वरूप मान 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(); 
संबंधित मुद्दे