कैसे # में एक सूची पाने के लिए


89

मेरे पास List<String>इस सूची से एक सबलिस्ट लेने की आवश्यकता है। क्या .NET 3.5 में इसके लिए सूची की कोई विधियाँ उपलब्ध हैं?


क्या आप हमें एक कोड नमूना दिखा सकते हैं जो आपके पास है, या स्पष्ट है? मैं सवाल का पालन नहीं कर रहा हूँ।
डेविड

मेरी एक सूची है, सूची <स्ट्रिंग> सूची = नई सूची <स्ट्रिंग> (); मुझे सूची 2 से लंबाई -1 तक इस सूची में से एक सबलिस्ट लेने की आवश्यकता है
थॉमस मानिलिल

जवाबों:


129

आप सूची चाहते हैं :: GetRange (firstIndex, count)। Http://msdn.microsoft.com/en-us/library/21k0e39c.aspx देखें

// I have a List called list
List sublist = list.GetRange(5, 5); // (gets elements 5,6,7,8,9)
List anotherSublist = list.GetRange(0, 4); // gets elements 0,1,2,3)

क्या आप उसके बाद हैं?

यदि आप मूल सूची से सबलिस्ट आइटम हटाना चाहते हैं, तो आप ऐसा कर सकते हैं:

// list is our original list
// sublist is our (newly created) sublist built from GetRange()
foreach (Type t in sublist)
{
    list.Remove(t);
}

4
आप एक सूची से आइटम नहीं निकाल सकते, जबकि उन पर फ़ॉरचार्ज के साथ पुनरावृत्ति होती है .....!
slugster

Slugster; मैं 'a' सूची से हटाते समय सूची 'b' पर पुनरावृत्ति कर रहा हूँ। यह कानूनी है :)
जोश

6

क्या आपकी सूची में LINQ क्वेरी चलाना उतना ही आसान होगा?

List<string> mylist = new List<string>{ "hello","world","foo","bar"};
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();

1
यह मूल सूची के खंड की एक प्रति है, मूल सूची के एक हिस्से पर एक दृश्य नहीं है।
असद सईदुद्दीन

@Asad इस उत्तर का बिंदु यह बताना था कि OP LINQ का उपयोग कर सकता है। आपने बताया है कि यह एक प्रति बनाता है। बहुत खुबस। आपकी प्रतिभा शायद इस सवाल को संपादित करने में बेहतर इस्तेमाल कर सकती है कि मैं 5.5 साल पहले छोड़ दिए गए बिंदु की तुलना में भी बेहतर हो। यदि आप इसे संपादित करते हैं, तो आपको इंटरनेट न्याय लीग ऑफ़ पेडेंट्री में क्रेडिट मिलेगा, और यह अच्छी तरह से कमाया जाएगा!
पी। काम्पबेल

10
मैं ( कुछ अन्य लोगों की तरह ) subListजावा से कुछ इसी तरह की तलाश कर रहा था , जो मूल सूची में एक परिवर्तनशील दृश्य को उजागर करता है। यह अलग तरह से व्यवहार करता है, जो तुरंत स्पष्ट नहीं हो सकता है, इसलिए मैंने सोचा कि जो भी इसे बाद में देखता है, उसके लाभ के लिए इसे इंगित करना उपयोगी होगा। विषय से हटकर, आप योग या ध्यान या कुछ और करना चाहते हैं; आप बिना किसी उकसावे के 0 से रेड-इन-फेस पागल हो गए।
असद सईदुद्दीन

3

LINQ से कहां क्लॉज का उपयोग करें:

List<object> x = new List<object>();
x.Add("A");
x.Add("B");
x.Add("C");
x.Add("D");
x.Add("B");

var z = x.Where(p => p == "A");
z = x.Where(p => p == "B");

"पी" के ऊपर दिए गए कथनों में वह वस्तु है जो सूची में है। इसलिए यदि आपने डेटा ऑब्जेक्ट का उपयोग किया है, तो:

public class Client
{
    public string Name { get; set; }
}

तब आपका linq ऐसा दिखेगा:

List<Client> x = new List<Client>();
x.Add(new Client() { Name = "A" });
x.Add(new Client() { Name = "B" });
x.Add(new Client() { Name = "C" });
x.Add(new Client() { Name = "D" });
x.Add(new Client() { Name = "B" });

var z = x.Where(p => p.Name == "A");
z = x.Where(p => p.Name == "B");

आपके विस्तृत होने के बाद, मेरे पहले उदाहरण का उपयोग करें और इसे जोड़ें: z = x.GetRange (1, 3); x.emoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p));
स्लगस्टर

2

LINQ के साथ:

List<string> l = new List<string> { "1", "2", "3" ,"4","5"};
List<string> l2 = l.Skip(1).Take(2).ToList();

यदि आपको फ़ॉरच की आवश्यकता है, तो टोलिस्ट की कोई आवश्यकता नहीं है:

foreach (string s in l.Skip(1).Take(2)){}

LINQ का लाभ यह है कि यदि आप कुछ प्रमुख तत्व को छोड़ना चाहते हैं, तो आप यह कर सकते हैं:

List<string> l2 = l.Skip(1).ToList();
foreach (string s in l.Skip(1)){}

यानी गिनती / लंबाई आदि का ध्यान रखने की जरूरत नहीं।


0

आपके संग्रह वर्ग में एक विधि हो सकती है जो फ़िल्टर को परिभाषित करने के लिए पारित मानदंडों के आधार पर एक संग्रह (एक सबलिस्ट) लौटाती है। फॉर्च लूप के साथ एक नया संग्रह बनाएं और इसे पास करें।

या, विधि और लूप को एक "फ़िल्टर्ड" या "सक्रिय" ध्वज (संपत्ति) सेट करके मौजूदा संग्रह को संशोधित करें। यह काम कर सकता है, लेकिन मल्टीथ्रेडेड कोड में भी poblems पैदा कर सकता है। यदि संग्रह की सामग्री पर अन्य वस्तुएं दिखाई देती हैं तो यह या तो अच्छा है या बुरा है कि आप डेटा का उपयोग कैसे करते हैं।


0

उप-सूची में आइटम को उल्टा करें

int[] l = {0, 1, 2, 3, 4, 5, 6};
var res = new List<int>();
res.AddRange(l.Where((n, i) => i < 2));
res.AddRange(l.Where((n, i) => i >= 2 && i <= 4).Reverse());
res.AddRange(l.Where((n, i) => i > 4));

0,1,4,3,2,5,6 देता है


Rangeपूर्णांक डेटाटाइप के साथ सही है। क्या होगा यदि आपका डेटाटाइप है DataTimeऔर आपको दो विशिष्ट तिथियों के बीच रिकॉर्ड की एक सूची पुनः प्राप्त करने की आवश्यकता है?
जोगी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.