माचिस की तीली पर 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.