เชื่อมสตริงทั้งหมดภายใน List <string> โดยใช้ LINQ


543

มีการแสดงออก LINQ ง่าย ๆ ที่จะเรียงทั้งหมดของฉัน List<string>รายการคอลเลกชันเข้าstringด้วยกันด้วยอักขระตัวคั่นหรือไม่

เกิดอะไรขึ้นถ้าคอลเลกชันเป็นของวัตถุที่กำหนดเองแทนstring? ลองนึกภาพฉันต้อง concatenate object.Nameบน


37
ทำไม linq และไม่ใช่ string.Join ()
อลัน

14
string.Join ดีกว่า แต่ฉันคิดว่า linq ทำให้โค้ดของคุณสนุกนั่นอาจเป็นสาเหตุ!
Ali Ersöz

14
String.Join ดีกว่าเพราะใช้ StringBuilder และหลีกเลี่ยงประสิทธิภาพ O (n ^ 2) ของการต่อข้อมูลซ้ำซ้อน
Kennet Belenky

1
ปัญหาด้านประสิทธิภาพการใช้งาน LINQ?
PreguntonCojoneroCabrón

คำตอบ:


525

โดยใช้ LINQ สิ่งนี้จะทำงานได้;

string delimiter = ",";
List<string> items = new List<string>() { "foo", "boo", "john", "doe" };
Console.WriteLine(items.Aggregate((i, j) => i + delimiter + j));

คำอธิบายคลาส:

public class Foo
{
    public string Boo { get; set; }
}

การใช้งาน:

class Program
{
    static void Main(string[] args)
    {
        string delimiter = ",";
        List<Foo> items = new List<Foo>() { new Foo { Boo = "ABC" }, new Foo { Boo = "DEF" },
            new Foo { Boo = "GHI" }, new Foo { Boo = "JKL" } };

        Console.WriteLine(items.Aggregate((i, j) => new Foo{Boo = (i.Boo + delimiter + j.Boo)}).Boo);
        Console.ReadKey();

    }
}

และนี่คือสิ่งที่ดีที่สุดของฉัน :)

items.Select(i => i.Boo).Aggregate((i, j) => i + delimiter + j)

40
เวลา O (n ^ 2) นัดอีกครั้ง
Kennet Belenky

2
หากคุณไม่เห็นวิธีการรวมคุณต้องเพิ่มโดยใช้ System.Linq;
Cédric Guillemette

6
ปัญหาคือว่าข้างต้นวิธี LinQ ไม่ทำงานกับรายการที่ว่างเปล่าหรือองค์ประกอบเดียว
Alexander

2
มันจะโยน InvalidOperationException ในกรณีที่รายการว่างเปล่า
2xMax

10
ทำไมไม่ใช้แค่ string.join โปรดยอมรับคำตอบของ Sedat เพื่อให้ทุกคนที่อยู่ในภาวะรีบเร่งไม่ได้เลือกโซลูชันนี้เมื่อ Sedat's เป็นตัวเลือกที่ดีกว่า
Skychan

966

ใน. NET 4.0 หรือใหม่กว่า:

String.Join(delimiter, list);

เพียงพอแล้ว


91
ฉันทั้งหมดสำหรับโซลูชั่น LINQ แต่มีประสิทธิภาพมากกว่า LINQ และวิธีการรวม ()
andleer

17
ทำความสะอาดมาก! ทำงานได้ดีสำหรับฉัน! string.Join (",", accs.Select (x => x.AccountID) .ToArray ()),
m4tt1mus

32
@ KonstantinSalavatov ฉันโพสต์คำตอบก่อนที่ OP จะชี้แจงว่าต้องอยู่ใน LINQ มันยังคงใช้ได้อย่างสมบูรณ์แบบสำหรับทุกคนที่พบคำตอบนี้ในขณะที่มองหาโซลูชัน "ไม่จำเป็น - LINQ" ใน Google เกี่ยวกับคำตอบนี้ "ไม่มีประโยชน์" ในบริบทนั้นไม่ยุติธรรม
Sedat Kapanoglu

7
สิ่งนี้สามารถใช้สำหรับสิ่งอื่นที่ไม่ใช่ List <String>s และจะเรียกใช้เมธอด ToString ()
Kian

ไม่ทำงานหากนี่เป็นข้อความค้นหาที่ไปยังฐานข้อมูล ใช้งานได้กับหน่วยความจำเท่านั้น
alansiqueira27

124

นี่สำหรับอาเรย์สตริง:

string.Join(delimiter, array);

นี่คือรายการ <string>:

string.Join(delimiter, list.ToArray());

และนี่คือรายการของวัตถุที่กำหนดเอง:

string.Join(delimiter, list.Select(i => i.Boo).ToArray());

25
String.Join มีโอเวอร์โหลดที่ใช้ IEnumerable ดังนั้นคุณไม่จำเป็นต้องใช้ ToArray () โทร
arolson101

9
โปรดทราบว่าเกินพิกัด IEnumerable มีเฉพาะใน 4.0 หรือใหม่กว่า หากคุณใช้เวอร์ชั่นที่เก่ากว่าคุณจะต้องมี ToArray ()
Rakuen42

2
อา! การโอเวอร์โหลดครั้งสุดท้ายนั้นเป็นสิ่งที่ฉันกำลังมองหา ฉันรู้ว่าจะต้องมีวิธีการแยกทรัพย์สินที่เฉพาะเจาะจง :)
Mike Devenney

56
using System.Linq;

public class Person
{
  string FirstName { get; set; }
  string LastName { get; set; }
}

List<Person> persons = new List<Person>();

string listOfPersons = string.Join(",", persons.Select(p => p.FirstName));

26

คำถามที่ดี. ฉันใช้อยู่

List<string> myStrings = new List<string>{ "ours", "mine", "yours"};
string joinedString = string.Join(", ", myStrings.ToArray());

ไม่ใช่ LINQ แต่ใช้งานได้


ทำไมต้องโทร. ToArray ()
ΕГИІИО

เนื่องจากย้อนกลับไปในช่วงวันที่เลวร้ายของปี 2009 string.Join ไม่มีส่วนขยายที่ยอมรับ IEnumerable
Jacob Proffitt


7

ฉันคิดว่าถ้าคุณกำหนดตรรกะในวิธีการส่วนขยายรหัสจะสามารถอ่านได้มากขึ้น:

public static class EnumerableExtensions { 
  public static string Join<T>(this IEnumerable<T> self, string separator) {  
    return String.Join(separator, self.Select(e => e.ToString()).ToArray()); 
  } 
} 

public class Person {  
  public string FirstName { get; set; }  
  public string LastName { get; set; }  
  public override string ToString() {
    return string.Format("{0} {1}", FirstName, LastName);
  }
}  

// ...

List<Person> people = new List<Person>();
// ...
string fullNames = people.Join(", ");
string lastNames = people.Select(p => p.LastName).Join(", ");

6

คุณสามารถใช้:

List<string> items = new List<string>() { "foo", "boo", "john", "doe" };

Console.WriteLine(string.Join(",", items));

การเข้ารหัสที่มีความสุข!


3

ฉันทำสิ่งนี้โดยใช้ LINQ:

var oCSP = (from P in db.Products select new { P.ProductName });

string joinedString = string.Join(",", oCSP.Select(p => p.ProductName));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.