ম্যাচকলেকশনে 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.