সি # অবজেক্টের তালিকা, আমি কীভাবে কোনও সংখ্যার যোগফল পাই


158

আমার কাছে জিনিসগুলির একটি তালিকা রয়েছে। স্বতন্ত্র বস্তুর প্রবেশের একটি সম্পত্তি পরিমাণ। আমি কী পরিমাণ অর্থ যোগ করব?

আমার তালিকাটি যদি দ্বিগুণ হয় তবে আমি এটির মতো কিছু করতে সক্ষম হতে পারি:

double total = myList.Sum();

তবে আমি এর অনুরূপ কিছু চাই, তবুও এই বাক্য গঠনটি ভুল।

double total = myList.amount.Sum();

এটি কীভাবে সম্পাদন করা উচিত? আমি মানটি লুপিং এবং গণনার পরিবর্তে সম্ভব হলে যোগফলটি ব্যবহার করতে চাই love

উত্তর:


310
using System.Linq;

...

double total = myList.Sum(item => item.Amount);

12
এটি কি আগ্রহের বাইরে ভবিষ্যদ্বাণী করার চেয়ে দ্রুত?
Coops

4
আমি @ কোডব্ল্যান্ডের প্রশ্নেও আগ্রহী। এই গণনাটি লুপের চেয়ে দ্রুততর হবে?
রেকর্ড

23
@ কুপস - আপনার প্রশ্নের জবাব দিতে ... ১০০,০০০ অবজেক্টযুক্ত একটি লিস্ট ব্যবহার করে, প্রতিটি বস্তু ড্যাটাটাইপের দ্বিগুণ রয়েছে, উপরের দ্রবণটি ব্যবহার করে ১,০০০ বার সংস্থান করে (মাইলিস্ট.সাম) ফোরচ ব্যবহার করে ০.৯৮ সেকেন্ডের তুলনায় ২.৪৪ সেকেন্ড সময় নেয় । যথাযথতার জন্য স্টপওয়াচ ক্লাসটি ব্যবহার করে অতিবাহিত সময় পরিমাপ করা হয়। সুতরাং মাইলিস্ট.সুম ব্যবহারের চেয়ে পূর্ববর্তীটি 2x এরও বেশি দ্রুত।
জো গেইট্টি

36

এবং আপনার যদি নির্দিষ্ট আইনের সাথে মেলে এমন আইটেমগুলিতে এটি করার দরকার হয় ...

double total = myList.Where(item => item.Name == "Eggs").Sum(item => item.Amount);

11

অন্য বিকল্প:

myPlanetsList.Select(i => i.Moons).Sum();

5
পরিবর্তে .Select(i => i.Moons).Sum()আপনি ব্যবহার করতে পারেন.Sum(i => i.Moons)
ম্যাসন

1
@ ম্যাসন, ঠিক এবং তেমনিভাবে অ্যালেক্স তার আগের উত্তরে সমস্যার দিকে এগিয়ে এসেছিলেন, তাই আমি ঠিক একই জিনিসটি করার একটি ভিন্ন উপায় দিয়েছি।
দরকারী

1
হ্যাঁ হ্যাঁ, আমার ভুল ধারণার জন্য দুঃখিত।
ম্যাসন

আমি প্রশংসা করি যে এটি একটি অনন্য উত্তর, তবে পারফর্মেন্সের ক্ষতি হবে না?
পিটার লেঞ্জো

2

আপনি যেমন পরীক্ষা করতে চালাতে পারেন উদাহরণ কোড এখানে:

var f = 10000000;
var p = new int[f];

for(int i = 0; i < f; ++i)
{
    p[i] = i % 2;
}

var time = DateTime.Now;
p.Sum();
Console.WriteLine(DateTime.Now - time);

int x = 0;
time = DateTime.Now;
foreach(var item in p){
   x += item;
}
Console.WriteLine(DateTime.Now - time);

x = 0;
time = DateTime.Now;
for(int i = 0, j = f; i < j; ++i){
   x += p[i];
}
Console.WriteLine(DateTime.Now - time);

জটিল বস্তুর জন্য একই উদাহরণ:

void Main()
{
    var f = 10000000;
    var p = new Test[f];

    for(int i = 0; i < f; ++i)
    {
        p[i] = new Test();
        p[i].Property = i % 2;
    }

    var time = DateTime.Now;
    p.Sum(k => k.Property);
    Console.WriteLine(DateTime.Now - time);

    int x = 0;
    time = DateTime.Now;
    foreach(var item in p){
        x += item.Property;
    }
    Console.WriteLine(DateTime.Now - time);

    x = 0;
    time = DateTime.Now;
    for(int i = 0, j = f; i < j; ++i){
        x += p[i].Property;
    }
    Console.WriteLine(DateTime.Now - time);
}

class Test
{
    public int Property { get; set; }
}

সংকলক অনুকূলিতকরণ সহ আমার ফলাফলগুলি হ'ল:

00:00:00.0570370 : Sum()
00:00:00.0250180 : Foreach()
00:00:00.0430272 : For(...)

এবং দ্বিতীয় পরীক্ষার জন্য:

00:00:00.1450955 : Sum()
00:00:00.0650430 : Foreach()
00:00:00.0690510 : For()

দেখে মনে হচ্ছে যে লিনকুই সাধারণত (...) এর চেয়ে ধীর হয় তবে আমার পক্ষে কী অদ্ভুত তা হ'ল ফোরচ (...) লুপের চেয়ে দ্রুত বলে মনে হয়।


2
ভবিষ্যতে উল্লেখের জন্য, কটাক্ষপাত আছে Stopwatchমধ্যে System.Diagnosticsযেমন একটি উচ্চ ক্ষমতা সম্পন্ন সময় রেকর্ডার নেই। (আমি আপনাকে বিটিডব্লিউকে কমিয়ে দেইনি)
মেইরিওন হিউজেস

1
DateTime.Nowপরিমাপের জন্য ব্যবহার করবেন না । এটি সর্বদা স্থানীয় সময় হিসাবে প্রত্যাবর্তন করে কারণ এর ভয়াবহ অভিনয় রয়েছে। DateTime.UtcNowদ্রুততর; তবে এটি এখনও Stopwatchশ্রেণীর মতো উচ্চ রেজোলিউশন ব্যবহার করে না ।
গিরিগেস কাসেজেগ

3
এটি প্রশ্নের উত্তর দেয় না।
মার্ক প্যাটিসন

ঠিক আছে, টিপ জন্য ধন্যবাদ।
স্কোরগুলি

2
যদিও আপনার উদ্দেশ্যটি ভাল - মার্ক সঠিক - আপনি স্পষ্টভাবে প্রশ্নের উত্তর দিচ্ছেন না। আমি আপনাকে এটির পরিবর্তনের পরামর্শ দিচ্ছি: "আপনি এটি কীভাবে করতে পারেন তা এখানে" এবং "প্রতিটি বিকল্পের সিপিইউ সম্পাদনা এখানে"। এছাড়াও নীতিগতভাবে যদি আপনি নিজের পরীক্ষার পদ্ধতিটি বর্ণনা করেন তবে আপনাকে আমাদের কোডটি প্রদর্শন করতে হবে না।
মেইরিওন হিউজেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.