<t> তালিকায় অন্য যে কোনও একটি তালিকা রয়েছে কিনা তা পরীক্ষা করে দেখুন


97

আমার এই জাতীয় পরামিতিগুলির একটি তালিকা রয়েছে:

public class parameter
{
    public string name {get; set;}
    public string paramtype {get; set;}
    public string source {get; set;}
}

IEnumerable<Parameter> parameters;

এবং আমি এটির বিরুদ্ধে স্ট্রিংগুলির একটি অ্যারে পরীক্ষা করতে চাই।

string[] myStrings = new string[] { "one", "two"};

আমি পরামিতি তালিকার পুনরাবৃত্তি করতে চাই এবং উত্স সম্পত্তিটি যে কোনও মাইস্ট্রিং অ্যারের সমান কিনা তা পরীক্ষা করতে চাই। আমি নেস্টেড পূর্বাভাসের সাহায্যে এটি করতে পারি তবে আমি লিনাকের সাথে ঘুরে বেড়াতে এবং সংখ্যাগরিষ্ঠের মতো এক্সটেনশন পদ্ধতির মতো যেখানে নেস্টেড পূর্বাভাসগুলি ঠিক ভুল অনুভব করে তা কীভাবে করা যায় তা শিখতে চাই। এটি করার জন্য আরও একটি মার্জিত পছন্দের লিনক / ল্যাম্বদা / ডিলেগেট উপায় রয়েছে কি?

ধন্যবাদ

উত্তর:


208

আপনি Any()এই চেকটির জন্য নেস্টেড ব্যবহার করতে পারেন যা যে কোনওটিতে পাওয়া যায় Enumerable:

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));

দ্রুত বড় সংগ্রহের উপর করণ প্রকল্পের হবে parametersথেকে sourceএবং তারপর ব্যবহার Intersectযা অভ্যন্তরীণভাবে একটি ব্যবহার HashSet<T>তাই পরিবর্তে হে (ঢ ^ 2) প্রথম পদ্ধতির (দুই নেস্টেড loops এর সমতুল্য) জন্য আপনাকে হে (ঢ) চেক করতে পারেন:

bool hasMatch = parameters.Select(x => x.source)
                          .Intersect(myStrings)
                          .Any(); 

পার্শ্ব প্রতিক্রিয়া হিসাবেও আপনাকে সি # শৈলীর নির্দেশিকাগুলি মেনে চলার জন্য আপনার শ্রেণীর নাম এবং সম্পত্তির নামগুলি বড় করে তুলতে হবে।


ধন্যবাদ মনে হচ্ছে আমি যা চেষ্টা করছি তা চেষ্টা করে দেখব। কিছুটা আরও কার্যকারী দিক দিয়ে চারপাশে খেলতে হবে। শ্রেণিবদ্ধকরণ এবং বৈশিষ্ট্যগুলি সম্পর্কিত, উপরের উদাহরণটি লেখার সময় আমি কী ভুলে গিয়েছিলাম?
gdp

4
কেন ও (এন ^ 2)? আমরা কীভাবে দুটি ভেরিয়েবলের সাথে কথা বলছি তা ও (এন * মি) নয়? যেহেতু মি (প্যারামাইটগুলি) একটি ধ্রুবক, তাই এটি ও (এন) এর মতো। আমি দেখতে পাচ্ছি না এখানে ছেদটি কত দ্রুত হওয়া উচিত? তবে সম্মত হয়েছে, ইন্টারসেক্টের দ্রুত হওয়ার সম্ভাবনা রয়েছে তবে গ্যারান্টিযুক্ত নয়।
স্কোয়াজ

আপনি ঠিক বলেছেন যে এটি ও (এন * মি) হওয়া উচিত - মি কোনও ধ্রুবক নয় - এটি তালিকার একটির আকার, যদিও দেওয়া বিশেষ উদাহরণে এটি "2" হতে পারে। এমনকি ধ্রুবক মানগুলি যদিও অনুশীলনে তুচ্ছ নয় - সমস্ত অ-তুচ্ছ তালিকার দৈর্ঘ্যের জন্য Intersectদ্রুত হবে - তালিকাগুলি যদি তুচ্ছভাবে সংক্ষিপ্ত হয় তবে এটি কোনওভাবেই বা অন্য কোনও বিষয় বিবেচনা করে না (সেক্ষেত্রে পারফরম্যান্স সম্ভবত যাইহোক আপনার উদ্বেগ নয়) )
ব্রোকেনগ্লাস

শর্তটি সত্য হয়ে ওঠার সাথে তালিকার সূচীটি কীভাবে আবিষ্কার করবেন? বাক্য সহ আমার একটি তালিকা আছে। আমার বিশেষ শব্দগুলির সাথে একটি অ্যারে রয়েছে। বাক্যটিতে অ্যারের থেকে কমপক্ষে একটি শব্দ থাকলে আমি তালিকার সূচীগুলি চাই। @ ব্রোকেনগ্লাস
কিরুশান

4
পারফরম্যান্স বুদ্ধিমান, parameters.Any(x => myStrings.Contains(x.source));আপনার প্রথম উদাহরণের চেয়ে ভাল না ?
ফ্লুপ

3

অন্য তালিকায় ম্যাচের উপাদান রয়েছে কিনা তা জানতে এখানে একটি নমুনা দেওয়া হয়েছে

List<int> nums1 = new List<int> { 2, 4, 6, 8, 10 };
List<int> nums2 = new List<int> { 1, 3, 6, 9, 12};

if (nums1.Any(x => nums2.Any(y => y == x)))
{
    Console.WriteLine("There are equal elements");
}
else
{
    Console.WriteLine("No Match Found!");
}

4
মনে রাখবেন যে জড়িত তালিকাগুলি যদি বড় হয় তবে এটি Intersectপদ্ধতির চেয়ে অনেক ধীর হয়ে যাবে , কারণ এটি তালিকার আকারগুলিতে ও (এন * এম)। (এটি স্মৃতিতে ও (1)))
জন স্কিটি

1

যদি উভয় তালিকাটি খুব বড় হয় এবং যখন আমরা লামদা এক্সপ্রেশন ব্যবহার করি তবে এটি পেতে খুব বেশি সময় লাগবে। প্যারামিটারগুলির তালিকা আনতে এই ক্ষেত্রে লিনাক ব্যবহার করা ভাল:

var items = (from x in parameters
                join y in myStrings on x.Source equals y
                select x)
            .ToList();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.