2012-03-21 13 views
9

मेरे पास वस्तुओं की सूची की एक सूची है और मैं सोच रहा था कि कोई इस सूची को फ़िल्टर करने के लिए लैम्ब्डा अभिव्यक्ति के साथ मेरी सहायता कर सकता है या नहीं।आइटम की सूची की सूची फ़िल्टर करने के लिए लैम्ब्डा अभिव्यक्ति

public class Item { 
    public string Name {get;set;} 
    public string Action {get;set;} 
} 

मैं इस सूची को फ़िल्टर और केवल आइटम जहां की सूची में से उन लोगों की सूची प्राप्त करना चाहते हैं:

List<List<Item>> myList = ExtractList(); 

यहाँ मेरी मद वर्ग दिखता है की तरह है:

यहाँ मेरी सूची दिखता है की तरह है आइटम का नाम = "एबीसी" और आइटम एक्शन = "123"।

किसी भी मदद

+2

आपको लगता है कि अंतिम वाक्य स्पष्ट करना चाहिए, आप उन सूचियों कि एबीसी/123 को शामिल की एक सूची चाहते हैं? या आप उन वस्तुओं की एक सूची चाहते हैं जिनमें एबीसी/123 शामिल है? – Guvante

+0

मुझे सूचियों की एक सूची चाहिए जिसमें एबीसी/123 – zSynopsis

उत्तर

25

सरल करने के लिए धन्यवाद:

myList.SelectMany(sublist => sublist) 
    .Where(item => item.Name == "ABC" && item.Action == "123"); 

यह आपको सभी सूचियों के अंदर सभी आइटम देता है।

आप उप-सूचियों कि बजाय आइटम शामिल चयन करना चाहते हैं:

myList.Where(sublist => sublist.Any(item => item.Name == "ABC" && item.Action == "123")); 

और अंत में अगर आप एक ही संरचना को बचाने के लिये लेकिन केवल आइटम है कि फिल्टर से मेल खाते रखने हैं:

var newList = myList.Select(sublist => sublist 
         .Where(item => item.Name == "ABC" && item.Action == "123") 
         .ToList()).ToList(); 
+0

धन्यवाद रोमकिन्स शामिल हैं! – zSynopsis

+0

बहुत बहुत धन्यवाद! मेरी समस्या हल –

3

यहां एक ऐसा है जो आपको सूचियां प्राप्त करता है जिसमें सूची में एक आइटम मिलान होता है नाम = "एबीसी" और एक्शन = "123"।

var newList = myList.Where(l => 
      l.Exists(i => i.Name == "ABC" 
        && i.Action == "123")).ToList(); 

आप केवल सूची आइटम है कि हालत से मेल की एक सूची की जरूरत है, तो आप कर सकते हैं:

var newList = (from l in myList 
      where l.Exists(i => i.Name == "ABC" && i.Action == "123") 
      select l.Where(i => i.Name == "ABC" && i.Action == "123").ToList()).ToList(); 

उपरोक्त सूची समतल (सूचियों की सूची के बजाय एक साधारण सूची में बदलने) के लिए, आपको foreach लूप करना होगा:

List<Item> newList2 = new List<Item>(); 
foreach(var list in newList) 
{ 
    newList2.AddRange(list); 
} 
+0

बिना किसी प्रस्ताव के फ़्लैट करना संभव है: 'myList.SelectMany (l => l) .सूची() '। –

0

यह काम कर सकता है;

List<Item> Items = new List<Item>(); 

myList.ForEach((item)=> 
{ 
    var items = item.Where(q=> q.Action == "123" && q.Name =="ABC"); 
    Items.AddRange(items); 
}); 
0

मुझे लगता है कि सरल LINQ वाक्य रचना के लिए सबसे आसान है पढ़ने के लिए:

var newList = 
    // gets the list of items 
    from listOfItems in myList 
    // extracts the list of items 
    from item in listOfItems 
    // filters by criteria 
    where item.Name == "ABC" && item.Action == "123" 
    // flattens into a IEnumerable<Item> 
    select item; 
संबंधित मुद्दे