আমার একটি ক্লাস আছে, এটির মতো:
public class MyClass
{
public int Value { get; set; }
public bool IsValid { get; set; }
}
প্রকৃতপক্ষে এটি অনেক বড়, তবে এটি সমস্যাটি (অদ্ভুততা) পুনরায় তৈরি করে।
আমি যোগফল পেতে চাই Value
, যেখানে উদাহরণটি বৈধ। এখনও অবধি আমি এর দুটি সমাধান খুঁজে পেয়েছি।
প্রথমটি হ'ল:
int result = myCollection.Where(mc => mc.IsValid).Select(mc => mc.Value).Sum();
দ্বিতীয়টি হ'ল এটি:
int result = myCollection.Select(mc => mc.IsValid ? mc.Value : 0).Sum();
আমি সবচেয়ে দক্ষ পদ্ধতি পেতে চাই। আমি প্রথমে ভেবেছিলাম যে দ্বিতীয়টি আরও দক্ষ হবে। তারপরে আমার তাত্ত্বিক অংশটি "ভাল, একটি হ'ল ও (এন + এম + এম), অন্যটি হ'ল (এন + এন) going কম সাথে "। আমি ভেবেছিলাম তারা সমান পারফর্ম করবে। সম্পাদনা: এবং তারপরে @ মার্টিন নির্দেশ করেছেন যে কোথায় এবং নির্বাচনগুলি একত্রিত হয়েছে, সুতরাং এটি আসলে ও (এম + এন) হওয়া উচিত। তবে নীচের দিকে নজর দিলে মনে হয় এটি সম্পর্কিত নয়।
তাই আমি পরীক্ষায় ফেলেছি।
(এটি 100+ লাইনস, তাই আমি ভেবেছিলাম এটিকে একটি সংক্ষেপ হিসাবে পোস্ট করা ভাল)
ফলাফলগুলি ছিল আকর্ষণীয়।
0% টাই সহনশীলতা সহ:
আঁশগুলি প্রায় ~ 30 পয়েন্টের পক্ষে Select
এবং পক্ষে Where
।
How much do you want to be the disambiguation percentage?
0
Starting benchmarking.
Ties: 0
Where + Select: 65
Select: 36
2% টাই সহনশীলতা সহ:
এটি একই, কিছু বাদে তারা 2% এর মধ্যে ছিল। আমি বলব যে এটি একটি ন্যূনতম মার্জিন এরর। Select
এবং Where
এখন মাত্র একটি ~ 20 পয়েন্ট সীসা আছে।
How much do you want to be the disambiguation percentage?
2
Starting benchmarking.
Ties: 6
Where + Select: 58
Select: 37
5% টাই সহনশীলতা সহ:
এটিই আমি আমার সর্বাধিক ব্যবস্থার ত্রুটি হিসাবে বলতে চাই। এটি এটি এর জন্য কিছুটা ভাল করে তোলে Select
তবে খুব বেশি নয়।
How much do you want to be the disambiguation percentage?
5
Starting benchmarking.
Ties: 17
Where + Select: 53
Select: 31
10% টাই সহনশীলতা সহ:
এটি আমার ত্রুটির প্রান্তের বাইরে, তবে আমি এখনও ফলাফলটিতে আগ্রহী। কারণ এটি এখন Select
এবং Where
বিশ পয়েন্টের নেতৃত্ব দেয় যা কিছু সময়ের জন্য ছিল।
How much do you want to be the disambiguation percentage?
10
Starting benchmarking.
Ties: 36
Where + Select: 44
Select: 21
25% টাই সহনশীলতা সহ:
এই ভাবে, হয় উপায় ত্রুটির আমার মার্জিন বাইরে, কিন্তু আমি এখনও ফলাফলে আগ্রহী কারণ Select
এবং Where
এখনও (প্রায়) তাদের 20 পয়েন্টে এগিয়ে রাখা। দেখে মনে হচ্ছে এটি একটি স্বতন্ত্র কয়েকটিতে এটি আউটক্লাসিং করছে, এবং এটিই এটির নেতৃত্ব দেয়।
How much do you want to be the disambiguation percentage?
25
Starting benchmarking.
Ties: 85
Where + Select: 16
Select: 0
এখন, আমি অনুমান করছি যে 20 পয়েন্টে এগিয়ে মধ্যম, যেখানে তারা উভয় পেতে আবদ্ধ হন থেকে এসেছেন প্রায় একই কর্মক্ষমতা। আমি এটি চেষ্টা করতে এবং এটি লগ করতে পারে, তবে এটি নেওয়া সম্পূর্ণ তথ্য হবে load একটি গ্রাফ আরও ভাল হবে, আমার ধারণা।
তাই আমি কি করেছি।
এটি দেখায় যে Select
লাইনটি স্থির (প্রত্যাশিত) রাখে এবং Select + Where
লাইনটি উপরে উঠে যায় (প্রত্যাশিত)। যাইহোক, আমার ধাঁধাটি কেন এটি Select
50 বা তার আগেরটির সাথে পূরণ হয় না : আসলে আমি 50 এরও আগে প্রত্যাশা করছিলাম, কারণ অতিরিক্ত গুনী তৈরি করতে হয়েছিলSelect
এবং Where
। মানে, এটি 20-পয়েন্টের সীসা দেখায়, তবে এটি কেন তা ব্যাখ্যা করে না। এটি, আমার ধারণা, এটিই আমার প্রশ্নের মূল বিষয়।
কেন এটি এমন আচরণ করে? আমার কি এটি বিশ্বাস করা উচিত? যদি না হয়, আমি অন্য একটি বা এই ব্যবহার করা উচিত?
@ কিংকং যেমন মন্তব্যে উল্লিখিত হয়েছে, আপনি তাও ব্যবহার করতে পারেন Sum
। সুতরাং আমার দুটি বিকল্প এখন এটিতে পরিবর্তন করা হয়েছে:
প্রথম:
int result = myCollection.Where(mc => mc.IsValid).Sum(mc => mc.Value);
দ্বিতীয়ত:
int result = myCollection.Sum(mc => mc.IsValid ? mc.Value : 0);
আমি এটিকে কিছুটা খাটো করে তুলব, কিন্তু:
How much do you want to be the disambiguation percentage?
0
Starting benchmarking.
Ties: 0
Where: 60
Sum: 41
How much do you want to be the disambiguation percentage?
2
Starting benchmarking.
Ties: 8
Where: 55
Sum: 38
How much do you want to be the disambiguation percentage?
5
Starting benchmarking.
Ties: 21
Where: 49
Sum: 31
How much do you want to be the disambiguation percentage?
10
Starting benchmarking.
Ties: 39
Where: 41
Sum: 21
How much do you want to be the disambiguation percentage?
25
Starting benchmarking.
Ties: 85
Where: 16
Sum: 0
বিশ-পয়েন্টের সীসা এখনও রয়েছে, অর্থাত এটি মন্তব্যে @ মার্সিনের দ্বারা নির্দেশিত Where
এবং Select
সংমিশ্রণের সাথে কিছু করার নেই ।
আমার পাঠ্য প্রাচীর মাধ্যমে পড়ার জন্য ধন্যবাদ! এছাড়াও, আপনি যদি আগ্রহী হন তবে এক্সেল গ্রহণ করা সিএসভিতে লগ করে এমন সংশোধিত সংস্করণটি এখানে রয়েছে।
Where
+ Select
ইনপুট সংগ্রহের ক্ষেত্রে দুটি পৃথক পুনরাবৃত্তি ঘটায় না। অবজেক্টগুলিকে লিনকিউ এটিকে একটি পুনরাবৃত্তিতে অনুকূলিত করে। আমার ব্লগ পোস্টে
mc.Value
।