Cast List <int> เป็น List <string> ใน. NET 2.0


97

คุณสามารถแคสต์List<int>ให้ได้List<string>หรือไม่?

ฉันรู้ว่าฉันสามารถวนซ้ำและ. ToString () สิ่งนี้ได้ แต่นักแสดงจะยอดเยี่ยม

ฉันอยู่ใน C # 2.0 (ไม่มีLINQ )

คำตอบ:


151

.NET 2.0 มีConvertAllวิธีการที่คุณสามารถส่งผ่านฟังก์ชันตัวแปลง:

List<int>    l1 = new List<int>(new int[] { 1, 2, 3 } );
List<string> l2 = l1.ConvertAll<string>(delegate(int i) { return i.ToString(); });

117

อัปเดตสำหรับปี 2010

List<int> l1 = new List<int>(new int[] { 1,2,3 } );
List<string> l2 = l1.ConvertAll<string>(x => x.ToString());

6
ขอบคุณ! สิ่งนี้ช่วยฉันได้มาก
Steve French

2
ไม่ได้มีการนำ lambdas มาใช้ใน C # 3.0 ดังนั้นสิ่งนี้จะไม่ทำงานใน 2.0
ลุค

ฉันพบว่ามันใช้งานได้กับ VS2008 และ. NET 2.0 ตราบเท่าที่คุณติดตั้ง. NET 3.0 เป็นอย่างน้อย ดูstackoverflow.com/questions/3341846/…
igelineau

1
ผู้คนควรแยกความแตกต่างระหว่างเวอร์ชัน. NET และเวอร์ชัน C # เนื่องจากลูกศรx => x.ToString()ถูกคอมไพล์เป็น IL ประเภทเดียวกับdelegate(int x) { return x.ToString(); }ในกรณีนี้สิ่งสำคัญคือต้องมีคอมไพเลอร์ C # (เวอร์ชัน C #) ที่รู้ว่าอะไร=>คืออะไร เฟรมเวิร์กและรันไทม์ (เวอร์ชัน. NET) ไม่จำเป็นต้องมีคุณสมบัติพิเศษสำหรับสิ่งนี้ดังนั้น. NET 2.0 จึงใช้ได้ที่นี่
Jeppe Stig Nielsen

ปรากฎว่าคุณสามารถทิ้งได้<string>และยังใช้งานได้ ทำให้เพิ่งl1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛʙᴀᴋᴇʀ

8

C # 2.0 ทำได้List<T>.Convertหรือไม่? ถ้าเป็นเช่นนั้นฉันคิดว่าการคาดเดาที่ดีที่สุดของคุณคือการใช้สิ่งนั้นกับผู้รับมอบสิทธิ์:

List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Convert(delegate (int i) { return i.ToString(); });

บางสิ่งบางอย่างตามแนวเหล่านั้น


โหวตคำตอบของ Glenn ซึ่งน่าจะเป็นรหัสที่ถูกต้อง ;-)



5

คุณจะไม่สามารถแคสต์ได้โดยตรงเนื่องจากไม่มีการร่ายอย่างชัดเจนหรือโดยปริยายจาก int เป็นสตริงมันจะต้องเป็นวิธีการที่เกี่ยวข้องกับ. ToString () เช่น: -

foreach (int i in intList) stringList.Add(i.ToString());

แก้ไข - หรือตามที่คนอื่น ๆ ชี้ให้เห็นว่าค่อนข้างยอดเยี่ยมให้ใช้ intList.ConvertAll (delegate (int i) {return i ToString ();}); อย่างไรก็ตามเห็นได้ชัดว่าคุณยังต้องใช้. ToString () และเป็นการแปลงมากกว่า นักแสดง


3
การมีอยู่ของการร่ายระหว่างประเภททั่วไปไม่มีอะไรเกี่ยวข้องกับความสามารถในการร่ายระหว่างการฉายภาพ IE แม้ว่าจะintมีการแปลงเป็นโดยนัยหรือโดยชัดแจ้งstringแต่ก็ไม่ได้หมายความว่าList<int>จะมีการแปลงเป็นList<string>.
Adam Robinson

1

คุณต้องสร้างรายการใหม่ การแสดงบิตพื้นฐานของList<int>และList<string>เข้ากันไม่ได้อย่างสิ้นเชิงตัวอย่างเช่นบนแพลตฟอร์ม 64 บิตสมาชิกแต่ละคนมีขนาดไม่เท่ากัน

เป็นไปได้ในทางทฤษฎีที่จะปฏิบัติList<string>กับ a List<object>- สิ่งนี้จะพาคุณเข้าสู่โลกที่น่าตื่นเต้นของความแปรปรวนร่วมและความแปรปรวนและปัจจุบัน C # หรือ VB.NET ยังไม่รองรับ


@Curt :> เป็นไปได้ในทางทฤษฎีที่จะถือว่า> รายการ <สตริง> เป็นรายการ <วัตถุ> -> สิ่งนี้จะพาคุณเข้าสู่โลกที่น่าตื่นเต้น> ของความแปรปรวนร่วมและความแปรปรวนและ> ไม่ได้รับการสนับสนุนโดย C # หรือ> VB ในปัจจุบัน NET C # และ. NET รองรับ Covariance จริงๆ ไม่ใช่กับยาชื่อสามัญ
Christian Hagelid

1

result = listOfInt.Select(i => i.ToString(CultureInfo.InvariantCulture)).ToList()

แทนที่ผลลัพธ์ของพารามิเตอร์และ listOfInt เป็นพารามิเตอร์ของคุณ


สำหรับฉันทำงานได้อย่างถูกต้องผลลัพธ์ = listOfInt.Select (i => i ToString ()) ToList ();
Sharunas Bielskis

0

การแปลงจาก int List เป็น string List สามารถทำได้สองวิธีแบบ adittional นอกเหนือจาก ToString () ตามปกติ เลือกอันที่ถูกใจคุณมากกว่า

var stringlist = intlist.Select(x=>""+x).ToList();

หรือยัง:

var stringlist = intlist.Select(x=>$"{x}").ToList();

และในที่สุดแบบดั้งเดิม:

var stringlist = intlist.Select(x=>x.ToString()).ToList();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.