List‹long> เป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาคใน C#

สิ่งนี้มักจะเกิดขึ้น ฉันมีรายการและฉันต้องการไปที่สตริงที่คั่นด้วยเครื่องหมายจุลภาคขององค์ประกอบทั้งหมดในรายการที่ฉันสามารถใช้ใน SQL

วิธีที่หรูหราที่สุดในการทำเช่นนี้ใน C # คืออะไร? การวนซ้ำทั้งหมดนั้นเป็นเรื่องปกติ ยกเว้นองค์ประกอบแรกหรือองค์ประกอบสุดท้ายจะต้องเป็นกรณีพิเศษ เนื่องจากฉันไม่ต้องการเครื่องหมายจุลภาคนำหน้าหรือต่อท้าย

มีหนึ่งซับที่ดีหรือไม่?


person John Shedletsky    schedule 02.12.2010    source แหล่งที่มา


คำตอบ (8)


string.Join คือเพื่อนของคุณ...

var list = new List<long> {1, 2, 3, 4};
var commaSeparated = string.Join(",", list);
person James Kovacs    schedule 02.12.2010
comment
ฉันเชื่อว่านั่นทำให้เกิดข้อผิดพลาดทางไวยากรณ์ - String.Join จะไม่รับ List‹long› เป็นอาร์กิวเมนต์ที่ 2 - person John Shedletsky; 02.12.2010
comment
@John Shedletsky: .NET Framework 4.0 เปิดตัว String.Join‹T› วิธีการ ( สตริง IEnumerable‹T›) - person dtb; 02.12.2010
comment
@dtb: ดูเหมือนจะเป็นวิธีการใหม่ของ .NET 4 - person Vlad; 02.12.2010
comment
@John - มันรวบรวมและให้ผลลัพธ์ที่คาดหวังแก่ฉัน ดังที่ etb กล่าวไว้ มีการโอเวอร์โหลดที่รับ IEnumerable‹T› (เปิดตัวใน .NET 4) - person James Kovacs; 02.12.2010
comment
ใช่แล้ว นี่คือสิ่งที่ฉันหวังว่ามันจะเป็น ตอนนี้ติดอยู่ที่ 3.5 ถอนหายใจ - person John Shedletsky; 02.12.2010
comment
@John - ด้วย. NET 3.5 สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือคำแนะนำของ Matthew ด้านบนด้วย Select() และ ToArray() - person James Kovacs; 02.12.2010
comment
นอกเหนือจาก: น่าตลกที่นักพัฒนาของเราบ่นเรื่องการติดอยู่บน. NET 3.5 ไม่นานมานี้ก็ดังมาก... - person James Kovacs; 02.12.2010

List<long> items = // init here
string result = string.Join(", ", items.Select(i => i.ToString()).ToArray());

ไม่แน่ใจว่าเป็นวิธีที่อลังการที่สุดหรือเปล่า แต่เป็นแบบ 1 ไลเนอร์!

ขณะนี้ยังมี string.Join ที่ยอมรับ IEnumerable<T> อีกด้วย ดังนั้นจึงสั้นลงอีก:

string result = string.Join(", ", items);

ด้วยการอนุมานประเภท คุณไม่จำเป็นต้องระบุ Join<long>

person Matthew Abbott    schedule 02.12.2010

string.Join(",", Array.ConvertAll(list.ToArray(), item => item.ToString()));

(เขียนลงในโพสต์โดยตรง ดังนั้นฉันอาจมีพารามิเตอร์บางอย่างผิด แต่คุณเข้าใจ)

person Neil Barnwell    schedule 02.12.2010
comment
ขั้นแรกให้จัดสรรอาร์เรย์ใหม่จาก List<> เนื่องจาก .ToArray() จากนั้นจึงจัดสรรอาร์เรย์อื่นเนื่องจาก Array.ConvertAll เนื่องจาก .NET เวอร์ชัน 4.0 (Visual Studio 2010) มีการโอเวอร์โหลดที่ทำงานโดยตรง string.Join(",", list) - person Jeppe Stig Nielsen; 02.07.2013

หากคุณต้องทำด้วยตนเอง คุณไม่ควรมีกรณีพิเศษสำหรับทั้งค่าแรกและค่าสุดท้าย คุณสามารถทำได้ดังนี้:

List<long> junk = // have some values here;
string separator = string.Empty;
string list = string.Empty;

foreach(long john in junk)
{
    list += separator + john.ToString();
    separator = ", ";
}

ไม่ได้บอกว่าคุณควรทำเช่นนี้ ถือว่านี่เป็นเพียงความคิดเห็น

person bevacqua    schedule 02.12.2010

// Content IDs
List<long> cIds = new List<long>();
cIds.Add(1);
cIds.Add(2);
cIds.Add(1);
cIds.Add(3);
cIds.Add(3);
string ids = string.Join(",", cIds.Distinct().Select(x => x.ToString()).ToArray());
// The example return the following output:
// ids = "1,2,3"

ส่งคืนรายการรายการที่ไม่ซ้ำโดยคั่นด้วยเครื่องหมายจุลภาค

person gschuster    schedule 01.03.2011

    public static string CommaSeparate(this IEnumerable<string> values)
    {
        if (values.Count() == 0) return "[none]";
        return string.Join(", ", values.ToArray());
    }

นี่เป็นวิธีการขยายที่ฉันใช้เพื่อทำสิ่งนี้ในแอปพลิเคชันของฉัน มันขึ้นอยู่กับ IEnumerable แต่ควรจะคล้ายกันสำหรับ List

person Marcie    schedule 02.12.2010

ฉันเชื่อว่า String.Join ทำเช่นนั้น

person karl.r    schedule 02.12.2010

List<long> list =new List<long>(){1,2,3,4,5,6,7};

StringBuilder str =new StringBuilder();    

foreach(var i in list)
{
str.Append(i).Append(',');
}

สิ่งนี้จะผนวกค่าแบบยาวใน (stringBuilder) str เป็น

ตอบ STR = 1,2,3,4,5,6,7

person Arun Manjhi    schedule 21.09.2012
comment
คำถามนี้มีคำตอบที่ทำเครื่องหมายว่ายอมรับแล้วมาระยะหนึ่งแล้ว ทางที่ดีควรรื้อฟื้นคำถามเฉพาะในกรณีที่คุณตอบได้เพิ่มสิ่งที่มีประโยชน์/มีประโยชน์จริงๆ - person Samuel Parkinson; 21.09.2012