2012-12-18 18 views
10

में एक साधारण LINQ क्वेरी चलाना मैं अभी भी LINQ और PLINQ के लिए बहुत नया हूं। मैं आमतौर पर बहुत सारे मामलों में लूप और List.BinarySearch का उपयोग करता हूं, लेकिन मैं उस मानसिकता से बाहर निकलने की कोशिश कर रहा हूं जहां मैं कर सकता हूं।समांतर

var matchedStaff = from s 
        in allStaff 
        where s.Matches(searchString) 
       select s; 

लेकिन मैं समानांतर में यह करने के लिए करना चाहते हैं::

public class Staff 
{ 
    // ... 
    public bool Matches(string searchString) 
    { 
    // ... 
    } 
} 

का उपयोग करते हुए "सामान्य" LINQ - - माफ करना, मैं शब्दावली से अपरिचित हूँ मैं निम्न कर सकते हैं

var matchedStaff = allStaff.AsParallel().Select(s => s.Matches(searchString)); 

जब मैं matchedStaff के प्रकार की जांच करता हूं, तो यह bool एस की एक सूची है, जो मैं नहीं चाहता हूं।

सबसे पहले, मैं यहां क्या गलत कर रहा हूं, और दूसरी बात, मैं इस क्वेरी से List<Staff> कैसे वापस कर सकता हूं?

public List<Staff> Search(string searchString) 
{ 
    return allStaff.AsParallel().Select(/* something */).AsEnumerable(); 
} 

रिटर्न IEnumerable<type>, नहीं List<type>

+3

तुम अब भी PLINQ साथ क्वेरी सिंटैक्स (कि यह क्या कहा जाता है) का उपयोग कर सकते हैं: s से ' allStaff.AsParallel() में जहां s.Matchches (searchString) s' का चयन करें। – svick

उत्तर

26

अपने पहला सवाल के लिए, तुम सिर्फ Where साथ Select बदलना चाहिए:

var matchedStaff = allStaff.AsParallel().Where(s => s.Matches(searchString)); 

Select एक प्रक्षेपण ऑपरेटर, नहीं एक छानने से एक है, यही कारण है कि आप एक IEnumerable<bool> प्रक्षेपण के लिए इसी हो रही है है इनपुट अनुक्रम से आपके सभी कर्मचारियों की ऑब्जेक्ट्स में आपके Matches विधि कॉल द्वारा लौटाए गए बूल तक।

मुझे समझ में आता है कि यह आपके लिए select का उपयोग न करने के लिए अंतर्ज्ञानी हो सकता है जैसा कि ऐसा लगता है कि आप "क्वेरी सिंटैक्स" से अधिक परिचित हैं, जहां चयन कीवर्ड अनिवार्य है जो "लैम्ब्डा सिंटैक्स" (या "धाराप्रवाह वाक्य रचना" ... जो कुछ भी नामकरण), लेकिन यह है कि यह कैसे है;)

अनुमान ऑपरेटरों, इस तरह के एक Select, दूसरे के लिए अनुक्रम से एक तत्व इनपुट के रूप में ले रही है और/परियोजनाओं को बदलने कर रहे हैं इस तत्व किसी भी तरह तत्व का प्रकार (यहां bool प्रकार का प्रक्षेपण)। जबकि फ़िल्टरिंग ऑपरेटरों, जैसे कि Where, अनुक्रम से तत्व को इनपुट के रूप में ले रहे हैं और आउटपुट अनुक्रम में तत्व को आउटपुट करते हैं या किसी अनुमान के आधार पर तत्व को आउटपुट नहीं कर रहे हैं।

अपने दूसरा सवाल, AsEnumerable एक IEnumerable रिटर्न के रूप में यह नाम से पता चलता है के रूप में;));) आप (पाने के लिए एक List<Staff> आप बल्कि ToList() बुलाना चाहिए के रूप में यह नाम से पता चलता है चाहते हैं:

return allStaff.AsParallel().Select(/* something */).ToList(); 

उम्मीद है कि यह मदद करता है।

6

समांतरता प्राप्त करने के लिए सामान्य LINQ वाक्यविन्यास को त्यागने की कोई आवश्यकता नहीं है।

var matchedStaff = from s in allStaff 
    where s.Matches(searchString) 
    select s; 

समानांतर LINQ (“PLINQ”) संस्करण होगा:: आप अपने मूल प्रश्न को फिर से लिखने कर सकते हैं

var matchedStaff = from s in allStaff.AsParallel() 
    where s.Matches(searchString) 
    select s; 

को समझने के लिए जहां bool रों से आ रहे हैं, जब आप लिखते हैं निम्नलिखित:

var matchedStaff = allStaff.AsParallel().Select(s => s.Matches(searchString)); 

यह निम्न क्वेरी वाक्यविन्यास के समतुल्य है:

var matchedStaff = from s in allStaff.AsParallel() select s.Matches(searchString); 

As stated by darkey, आप क्वेरी सिंटैक्स के बजाय सी # सिंटैक्स का उपयोग करना चाहते हैं, आप का उपयोग करना चाहिए Where():

var matchedStaff = allStaff.AsParallel().Where(s => s.Matches(searchString));