2009-11-18 12 views
31

है, मैं उत्पाद संस्थाओं का संग्रह प्राप्त करना चाहता हूं जहां उत्पाद। डिस्क्रिप्शन प्रॉपर्टी में स्ट्रिंग सरणी में से कोई भी शब्द शामिल है।LINQ: इकाई स्ट्रिंग फ़ील्ड में स्ट्रिंग्स की कोई सरणी

वह कुछ इस तरह (परिणाम किसी भी उत्पाद है जो शब्द "सरसों या" अचार "या" स्वाद "में विवरण पाठ किया था होगा) दिखेगा:

Dim products As List(Of ProductEntity) = New ProductRepository().AllProducts 

Dim search As String() = {"mustard", "pickles", "relish"} 

Dim result = From p In products _ 
    Where p.Description.Contains(search) _ 
    Select p 

Return result.ToList 

मैं पहले से ही this similar question लेकिन सका को देखा 'टी के बाद से आप देखने के लिए कि खोज एक शब्द जो पी का वर्णन आप मूल रूप से खोज में प्रत्येक मान के लिए परीक्षण की आवश्यकता है, तो इसके बारे में विवरण में निहित है में निहित है शामिल चाहते हैं कि उसे काम करने के लिए मिलता है।

उत्तर

75

पी

result = from p in products 
      where search.Any(val => p.Description.Contains(val)) 
      select p; 

यह लैम्ब्डा विधि के लिए ग # वाक्य रचना है के बाद से मेरी vb नहीं कि महान

+1

शानदार! इसने काम कर दिया। वीबी सिंटैक्स है: खोज। कोई भी (फ़ंक्शन (एन) पी। डिस्क्रिप्शन.ToLower.Contains (n)) –

+0

जब मैं ऐसा करने का प्रयास करता हूं, तो मुझे "क्लोजर प्रकार 'प्रकार का निरंतर मान बनाने में असमर्थता मिलती है। केवल आदिम प्रकार (जैसे इंट 32, स्ट्रिंग, और ग्विड ') इस संदर्भ में समर्थित हैं। " मेरी "खोज" एक सूची है और मेरा "विवरण" एक स्ट्रिंग भी है। –

6
Dim result = From p in products _ 
      Where search.Any(Function(s) p.Description.Contains(s)) 
      Select p 
+0

अरे आपने अपना पहला वीबीएनईटी जवाब चुरा लिया है! ; पी +1 वैसे भी – leppie

+0

@leppie: हाँ, यह मेरे कुछ वीबीएनईटी उत्तरों में से एक है। – jason

4

आप एक साधारण LINQ क्वेरी का उपयोग कर सकते हैं अगर आप सभी की जरूरत सबस्ट्रिंग के लिए जाँच करने के लिए है:

var q = words.Any(w => myText.Contains(w)); 
// returns true if myText == "This password1 is weak"; 

एक नियमित अभिव्यक्ति है कि सभी शब्दों की अलगाव के खिलाफ

  1. मिलान: आप पूरे शब्द के लिए जाँच करना चाहते हैं, तो आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

    // you may need to call ToArray if you're not on .NET 4 
    var escapedWords = words.Select(w => @"\b" + Regex.Escape(w) + @"\b"); 
    // the following line builds a regex similar to: (word1)|(word2)|(word3) 
    var pattern = new Regex("(" + string.Join(")|(", escapedWords) + ")"); 
    var q = pattern.IsMatch(myText); 
    
  2. विभाजन एक नियमित अभिव्यक्ति के साथ शब्दों में स्ट्रिंग, और शब्द संग्रह पर सदस्यता के लिए परीक्षण (इस तेजी से अगर आप एक HashSet एक List के बजाय में शब्द बनाने का उपयोग मिल जाएगा):

    var pattern = new Regex(@"\W"); 
    var q = pattern.Split(myText).Any(w => words.Contains(w)); 
    

आदेश में इस कसौटी के अनुसार तुम सब करने की है इसकी एक समारोह में डाल दिया और फोन वाक्य का एक संग्रह फिल्टर करने के लिए में Where:

012 @R द्वारा

=> How to check if any word in my List<string> contains in text से
var q = sentences.Where(s => Regex.Split(myText, @"\W").Any(w => words.Contains(w))); 

उत्तर:

// Given: 
// bool HasThoseWords(string sentence) { blah } 
var q = sentences.Where(HasThoseWords); 

या एक लैम्ब्डा में रख दें। मार्टिनो फर्नांडीस

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