LINQ का उपयोग करके सूची <string> के अंदर सभी स्ट्रिंग्स को समेटें


542

वहाँ एक आसान लाइनर अभिव्यक्ति है एक सीमांकक चरित्र के साथ एक के List<string>लिए मेरे पूरे संग्रह आइटम संक्षिप्त करने के लिए string?

क्या होगा अगर संग्रह के बजाय कस्टम वस्तुओं का है string? कल्पना कीजिए कि मुझे इस पर सहमति बनाने की आवश्यकता है object.Name


37
क्यों linq और स्ट्रिंग नहीं। ()?
एलन

14
string.Join बेहतर है, लेकिन मुझे लगता है कि linq आपके कोड को मज़ेदार बनाता है, यही कारण है कि हो सकता है!
अली इरशेज़

14
String.Join बेहतर है क्योंकि यह एक StringBuilder का उपयोग करता है और बार-बार संघनन के अंतर्निहित O (n ^ 2) प्रदर्शन से बचा जाता है।
केनेट बेलेंकी

1
LINQ का उपयोग करके प्रदर्शन समस्याएँ?
प्रीग्टनटनकोजेरो कैब्रोन

जवाबों:


524

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) समय फिर से प्रहार करता है।
केनेट बेलेंकी

2
यदि आप एग्रीगेट विधि नहीं देख सकते हैं, तो आपको System.Linq का उपयोग करना होगा;
सेड्रिक गुइलेमेटे

6
समस्या यह है कि ऊपर LinQ विधि खाली या एकल-तत्व सूची के साथ काम नहीं करती है।
अलेक्जेंडर

2
यह फेंक देगा InvalidOperationException मामले में आइटम खाली है।
2xMax

10
क्यों न केवल string.join का उपयोग करें? कृपया सेदत के जवाब को स्वीकार करें ताकि हड़बड़ी में कोई भी इस समाधान का चयन न करे जब सेडैट बेहतर विकल्प हो।
स्काइचन

966

.NET 4.0 या बाद के संस्करणों में:

String.Join(delimiter, list);

काफी है।


91
मैं सभी LINQ समाधानों के लिए हूँ, लेकिन यह LINQ और Aggregate () विधि की तुलना में अधिक कुशल है।
andleer

17
बहुत क्लीनर! मेरे लिए बहुत अच्छा काम किया! string.Join (",", accs.Select। (x => x.AccountID) .ToArray ()),
m4tt1mus

32
@KonstantinSalavatov मैंने अपना जवाब पोस्ट किया था इससे पहले कि ओपी ने स्पष्ट किया कि उसे LINQ में होना था। यह अभी भी किसी के लिए भी पूरी तरह से मान्य है जो Google पर "नहीं-जरूरी-LINQ" समाधान की तलाश में है। इस संदर्भ में "उत्तर उपयोगी नहीं" के संबंध में अनुचित है।
सेदत कपानोग्लू

7
यह लिस्ट <String>s के अलावा अन्य चीजों के लिए भी इस्तेमाल किया जा सकता है और ToString () विधि को कॉल करेगा।
कियान

अगर यह डेटाबेस में जाने वाली क्वेरी है तो काम नहीं करता है। यह केवल मेमोरी पर काम करता है।
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
आह! आखिरी ओवरलोड वह था जिसकी मुझे तलाश थी। मुझे पता था कि एक विशिष्ट संपत्ति निकालने का एक तरीका होना चाहिए। :)
माइक डेवनी 15

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 ()?
19 Г И О И О

क्योंकि 2009 के बुरे दिनों में वापस, string.Join एक IEnumerable स्वीकार कर लिया है कि एक विस्तार नहीं था।
जैकब प्रोफिट


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));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.