ম্যাচকলেকশনে LINQ এক্সটেনশন পদ্ধতির সিনট্যাক্স ব্যবহার করা


92

আমার কাছে নিম্নলিখিত কোড রয়েছে:

MatchCollection matches = myRegEx.Matches(content);

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

লিনকিউ এক্সটেনশন পদ্ধতি সিনট্যাক্স ব্যবহার করে এটি করার কোনও উপায় আছে?

এটার মতো কিছু:

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

উত্তর:


196
using System.Linq;

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

আইইনিউরেবল <T> এ সরবরাহ করা লিনকিউ এক্সটেনশনে অ্যাক্সেস পেতে আপনাকে কেবল এটিকে একটি IEnumerableথেকে একটি IEnumerable<Match>(আইএনিউমেবল <T>) এ রূপান্তর করতে হবে ।


এখানে প্রতি উত্তরে কে ভোট দিচ্ছেন? এই উত্তরটি আমার আপগেট, কাগনরেটস।
— কেভিন ক্যালিটভস্কি

+1 আমি এটি কেন অনুমান করা হয়েছিল তা জানার চেষ্টা করছি। আমি এটা দেখছি না।
— জেসন

এটি সঠিক হওয়ার সাথে সাথে এটি কীভাবে ভোট পেয়েছে তা নিয়ে আমি সত্যিই বিভ্রান্ত হয়ে
— পড়েছি

4
এটি কাজ করে, কেবলমাত্র নিশ্চিত হন যে আপনি using System.Linqঅন্যথায় এটি একটি সিনট্যাক্স ত্রুটি দেবে
— অ্যাশ বার্লিন-টেলর

4
আপনাকে ধন্যবাদ, বিভ্রান্ত কারও কাছে, Castসি # 8.0 সাল থেকে প্রয়োজনীয় নয়, তবে কোডটি পূর্বের ভাষা সংস্করণগুলিতে সংকলিত হবে না যদি এটি সরবরাহ না করা হয়।
— rvnlord

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>। প্রায় সমস্ত লিনকিউ টু অবজেক্টস এক্সটেনশন পদ্ধতিগুলিতে লক্ষ্যবস্তু করা IEnumerable<T>হয় এবং এর উল্লেখযোগ্য ব্যতিক্রমগুলি Castএবং OfTypeউভয়ই "দুর্বল" টাইপযুক্ত সংগ্রহকে (যেমন MatchCollection) জেনেরিতে রূপান্তর করতে ব্যবহৃত হয় IEnumerable<T>- যা পরবর্তী লিনকিউ অপারেশনের জন্য অনুমতি দেয়।



8

এটা চেষ্টা কর:

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

রেফারেন্সের জন্য, দয়া করে দেখুন Enumerable.Cast:

একটির উপাদানগুলিকে IEnumerableনির্দিষ্ট ধরণের রূপান্তর করে ।

মূলত এটি একটি IEnumerableরূপান্তর একটি উপায় IEnumerable<T>।


+1 আমি এটি কেন অনুমান করা হয়েছিল তা জানার চেষ্টা করছি। আমি এটা দেখছি না।
— জেসন

@ জেসন: সম্ভবত কেউ তাদের উত্তর বাড়ানোর চেষ্টা করছে।
— অ্যান্ড্রু হার 18

3

আমি মনে করি এটি এমন কিছু হবে:

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

4
নং পুরো বিষয়টি হ'ল MatchCollectionকেবল প্রয়োগ করে IEnumerable। এটি দৃ strongly়ভাবে টাইপ করা হয় না।
— জেসন

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;
 }

তারপরে আপনি এই এক্সটেনশন পদ্ধতিটিকে একটি অনুমিত আকারে রূপান্তর করতে কল করতে সক্ষম হবেন:

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

এটি আমার চেয়ে ভাল, আমি মনে করি না যে কোনও কোনও শিকারী হয়েছিল।
— পিএসটিজেডস

নং পুরো বিষয়টি হ'ল MatchCollectionকেবল প্রয়োগ করে IEnumerable। এটি দৃ strongly়ভাবে টাইপ করা হয় না।
— জেসন

@ জেসন ব্যতীত এটি আইএন নাম্বারযোগ্য <T> আইইনাম্বারেবলের মাধ্যমে Castালাইযোগ্য ast কাস্ট <টি>
— মিশরচেট

@ এসমার্কেট: হ্যাঁ, আমি জানি, যে কারণে আমি আপনার উত্তরটিকে উর্ধ্বতন করেছিলাম। এই উত্তর, সম্পাদনার আগে, এমনকি সংকলন করা হবে না।
— জেসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.