2011-03-28 17 views
28

मेरे पास 2 सूचियां हैं। 1 उत्पादों का संग्रह है। और दूसरा दुकान में उत्पादों का संग्रह है।LINQ: किसी सूची में आइटम लौटाएं जो किसी अन्य नाम (स्ट्रिंग) से मेल खाता है?

यदि सभी नाम उत्पादों में किसी भी नाम से मेल खाते हैं तो मुझे सभी दुकानों को वापस करने में सक्षम होना चाहिए।

मेरे पास यह है लेकिन यह काम नहीं कर रहा है। कोई विचार?

var products = shopProducts.Where(p => p.Name.Any(listOfProducts. 
      Select(l => l.Name).ToList())).ToList(); 

मुझे वास्तव में मुझे उन सभी दुकानों को देने की ज़रूरत है जहां नाम अन्य सूची में मौजूद है।

किसी भी मदद वास्तव में

धन्यवाद

+0

धन्यवाद सभी के लिए टिप्पणियां! मैं अब यह काम कर रहा हूँ ... धन्यवाद फिर से .. जवाब स्वीकार किया। – Martin

उत्तर

61
var products = shopProducts.Where(p => listOfProducts.Any(l => p.Name == l.Name)) 
          .ToList(); 

LINQ करने वाली वस्तुओं के लिए प्रयास करें, अगर listOfProducts कई आइटम हैं तो आप बेहतर प्रदर्शन प्राप्त हो सकता है यदि आप HashSet<T> बनाते हैं जिसमें सभी आवश्यक नाम हैं और फिर अपने क्यू में इसका उपयोग करें uery। HashSet<T> में ओ (एन) की तुलना में ओ (एन) की तुलना में मनमानी IEnumerable<T> है।

var names = new HashSet<string>(listOfProducts.Select(p => p.Name)); 
var products = shopProducts.Where(p => names.Contains(p.Name)) 
          .ToList(); 

LINQ करने वाली एसक्यूएल के लिए, मैं उम्मीद होती है (आशा?) कि प्रदाता क्वेरी के किसी भी मैनुअल फेरबदल की जरूरत के बिना स्वचालित रूप से उत्पन्न एसक्यूएल का अनुकूलन कर सकते हैं।

+0

ऑब्जेक्ट करने के लिए linq के लिए अच्छी चाल। – mavnn

+0

धन्यवाद। यह वास्तव में सहायक था। – ajexpress

1

सराहना इस

var products = shopProducts.Where(m=> listOfProducts.Select(l=>l.Name).ToList().Contains(m=>m.Name)); 
1
var products = shopProducts 
     .Where(shopProduct => 
       listOfProducts.Any(p => shopProduct.Name == p.Name)) 
     .ToList(); 
10

आप उदाहरण के लिए एक में शामिल होने के इस्तेमाल कर सकते हैं,:

var q = from sp in shopProducts 
     join p in listOfProducts on sp.Name equals p.Name 
     select sp; 
एक संपूर्ण गाइड

में शामिल होने पर here है।

+0

मुझे 'विशेष' लिनक सिंटैक्स से नफरत है, लेकिन अवधारणात्मक रूप से शामिल होने के लिए शायद linq-to-sql के साथ जाने का तरीका है। लिनक के साथ ऑब्जेक्ट करने के लिए मुझे इतना यकीन नहीं है कि बेहतर प्रदर्शन करेगा। – mavnn

+0

linq-to-object के बारे में - इस जवाब में क्वेरी अंततः एक गणना करने के लिए अनुवाद करती है। जॉइन कॉल, जो दस्तावेज़ के अनुसार हैश-लुकअप है। Http: //msdn.microsoft.com/en-us/library/bb534675 .aspx - "डिफ़ॉल्ट समानता तुलनाकर्ता, डिफ़ॉल्ट, हैश के लिए प्रयोग किया जाता है और चाबियाँ तुलना करता है।" – devgeezer

4

आप IEqualityComparer<T> बना सकते हैं जो कहता है कि समान नाम वाले उत्पाद बराबर हैं।

class ProductNameEqulity : IEqualityComparer<Product> 
{ 
    public bool Equals(Product p1, Product p2) 
    { 
     return p1.Name == p2.Name 
    } 

    public int GetHashCode(Product product) 
    { 
     return product.Name.GetHashCode(); 
    } 
} 

फिर आप इसे Intersect एक्सटेंशन विधि में उपयोग कर सकते हैं।

var products = shopProducts.Intersect(listOfProducts, new ProductNameEquality()); 
+0

यह दृष्टिकोण मेरा वोट प्राप्त करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे