माचिस की तीली पर LINQ एक्सटेंशन मेथड सिंटैक्स का उपयोग करना


91

मेरे पास निम्नलिखित कोड हैं:

MatchCollection matches = myRegEx.Matches(content);

bool result = (from Match m in matches
               where m.Groups["name"].Value.Length > 128
               select m).Any();

LINQ एक्सटेंशन मेथड सिंटैक्स का उपयोग करने का कोई तरीका है?

कुछ इस तरह:

bool result = matches.Any(x => ... );

जवाबों:


191
using System.Linq;

matches.Cast<Match>().Any(x => x.Groups["name"].Value.Length > 128)

तुम बस यह एक से बदलने की आवश्यकता IEnumerableएक करने के लिए IEnumerable<Match>(IEnumerable <टी>) IEnumerable पर <टी> प्रदान की LINQ विस्तार के लिए उपयोग मिलता है।


कौन यहाँ पर हर जवाब मतदान कर रहा है? इस उत्तर को मेरा उत्थान, संज्ञान प्राप्त होता है।
— केविन कालिटोवस्की

+1 मैं यह पता लगाने की कोशिश कर रहा हूं कि इसे क्यों डाउन किया गया था। मैं इसे नहीं देख रहा हूं।
— जेसन

मैं वास्तव में उलझन में हूँ कि यह कैसे सही है क्योंकि इसे वोट मिला
— 18ar 18 पर msarchet

बहुत सारे जवाबों को दरकिनार कर दिया गया। मैंने एक समान उत्तर दिया है, लेकिन मुझे आशा है कि थोड़ा फुलर है।
— जॉन स्कीट

1
यह काम करता है, बस यह सुनिश्चित करें कि आप एक using System.Linqऔर हैं यह एक वाक्यविन्यास त्रुटि देगा
— ऐश बर्लिन-टेलर

46

जब आप एक स्पष्ट श्रेणी चर प्रकार निर्दिष्ट करते हैं , तो संकलक एक कॉल सम्मिलित करता है Cast<T>। तो यह:

bool result = (from Match m in matches
               where m.Groups["name"].Value.Length > 128
               select m).Any();

इसके बराबर है:

bool result = matches.Cast<Match>()
                     .Where(m => m.Groups["name"].Value.Length > 128)
                     .Any();

जिसे इस प्रकार भी लिखा जा सकता है:

bool result = matches.Cast<Match>()
                     .Any(m => m.Groups["name"].Value.Length > 128);

इस मामले में Castकॉल की आवश्यकता है क्योंकि MatchCollectionकेवल लागू होता है ICollectionऔर IEnumerable, नहीं IEnumerable<T>। लगभग सभी LINQ से ऑब्जेक्ट्स के विस्तार के तरीकों को लक्षित किया जाता है IEnumerable<T>, जिनमें से उल्लेखनीय अपवादों के साथ Castऔर OfTypeदोनों का उपयोग "कमजोर" टाइप किए गए संग्रह (जैसे MatchCollection) को एक जेनेरिक में बदलने के लिए किया जाता है IEnumerable<T>- जो इसके बाद LINQ संचालन के लिए अनुमति देता है।



7

इसे इस्तेमाल करे:

var matches = myRegEx.Matches(content).Cast<Match>();

संदर्भ के लिए, कृपया देखें Enumerable.Cast:

IEnumerableनिर्दिष्ट प्रकार के तत्वों को परिवर्तित करता है ।

मूल रूप से यह एक मोड़ से एक तरीका है IEnumerableएक में IEnumerable<T>।


+1 मैं यह पता लगाने की कोशिश कर रहा हूं कि इसे क्यों डाउन किया गया था। मैं इसे नहीं देख रहा हूं।
— जेसन

@ जेसन: सबसे अधिक संभावना है कि कोई उनके उत्तर को बढ़ावा देने की कोशिश कर रहा था।
— एंड्रयू हरे

2

मुझे लगता है कि यह कुछ इस तरह होगा:

bool result = matches.Cast<Match>().Any(m => m.Groups["name"].Value.Length > 128);

1
नहीं, पूरे बिंदु यह है कि MatchCollectionकेवल लागू होता है IEnumerable। यह दृढ़ता से टाइप नहीं है।
— जेसन

2

आप कुछ इस तरह की कोशिश कर सकते हैं:

List<Match> matchList = matches.Cast<Match>().Where(m => m.Groups["name"].Value.Length > 128).ToList();

-1

संपादित करें:

 public static IEnumerable<T> AsEnumerable<T>(this IEnumerable enumerable)
 {
      foreach(object item in enumerable)
          yield return (T)item;
 }

तब आपको इस विस्तार विधि को कॉल करने में सक्षम होना चाहिए ताकि इसे IEnumerable में बदल सके:

 matches.AsEnumerable<Match>().Any(x => x.Groups["name"].Value.Length > 128);

यह मेरी तुलना में बेहतर है, मुझे याद नहीं था कि किसी ने एक विधेय लिया था।
— pstrjds

नहीं, पूरे बिंदु यह है कि MatchCollectionकेवल लागू होता है IEnumerable। यह दृढ़ता से टाइप नहीं है।
— जेसन

@ जेसन सिवाय इसके कि यह IEnumberable.Cast <T> के माध्यम से एक IEnumberable <T> में कास्टेबल है
— msarchet

@msarchet: हां, मुझे पता है, यही वजह है कि मैंने आपके जवाब को गलत बताया। यह उत्तर, संपादित होने से पहले, भी संकलित नहीं होता।
— जेसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.