বনাম পূর্বাচ বনাম লিনকু


86

আমি যখন ভিজ্যুয়াল স্টুডিওতে কোড লিখি তখন রিশার্পার (Godশ্বর এটি মঙ্গল করুন!) প্রায়শই আমাকে আরও কমপ্যাক্ট ফরচ ফরমে লুপের জন্য আমার পুরাতন-স্কুলটি পরিবর্তন করার পরামর্শ দেয়।

এবং প্রায়শই, আমি যখন এই পরিবর্তনটি গ্রহণ করি তখন রিশার্পার এক ধাপ এগিয়ে যায় এবং আমাকে চকচকে লিনকিউ ফর্মে আবার পরিবর্তন করার পরামর্শ দেয়।

সুতরাং, আমি আশ্চর্য হই: এই উন্নতির কিছু বাস্তব সুবিধা আছে কি? খুব সহজ কোড এক্সিকিউশনে, আমি কোনও গতি বাড়াতে (স্পষ্টতই) দেখতে পাচ্ছি না, তবে আমি কোডটি কম এবং কম পঠনযোগ্য হয়ে উঠতে দেখতে পাচ্ছি ... তাই আমি আশ্চর্য হই: এটি কি মূল্যবান?


2
কেবল একটি নোট - আপনি এসকিউএল সিনট্যাক্সের সাথে পরিচিত হলে লিনকিউ সিনট্যাক্সটি আসলে বেশ পঠনযোগ্য। লিনকিউ (এসকিউএল-এর মতো ল্যাম্বডা এক্সপ্রেশন এবং শৃঙ্খলিত পদ্ধতি) এর জন্য দুটি ফর্ম্যাটও রয়েছে, যা শিখতে আরও সহজ করে তুলতে পারে। এটি কেবল রিসার্পারের পরামর্শ হতে পারে যা এটিকে অপঠনযোগ্য বলে মনে হয়।
শওনা 16

3
থাম্বের নিয়ম হিসাবে, আমি সাধারণত জ্ঞাত দৈর্ঘ্যের অ্যারে বা পুনরাবৃত্তির সংখ্যা প্রাসঙ্গিক যেখানে অনুরূপ ক্ষেত্রে কাজ না করেই পূর্বাচ ব্যবহার করি। লিনকিউ-ইফিংয়ের ক্ষেত্রে, আমি সাধারণত দেখতে পাব যে রিসার্পার একটি পূর্বাভাসটি কী তৈরি করে, এবং যদি ফলাফলের লিনকিউ বিবৃতিটি পরিপাটি / তুচ্ছ / পাঠযোগ্য হয় তবে আমি এটি ব্যবহার করি এবং অন্যথায় আমি এটিকে ফিরিয়ে দিই। যদি প্রয়োজনগুলি পরিবর্তিত হয় বা যদি লিনিকউ বিবৃতিটি বিমূর্তভাবে দূরে সরিয়ে চলেছে তবে যুক্তিটি গ্রন্থিকরূপে ডিবাগ করা প্রয়োজন হলে মূল অ-লিনকিউ যুক্তিটি আবার লেখার পক্ষে যদি কাজ করা হয় তবে আমি লিনকুই করি না এবং এটিকে দীর্ঘস্থায়ী রাখি ফর্ম।
এড হেস্টিংস

একটি সাধারণ ভুল foreachহ'ল সংগ্রহ থেকে আইটেমগুলি গণনার সময় সরিয়ে ফেলা হয়, যেখানে forশেষ উপাদানটি থেকে শুরু করার জন্য সাধারণত একটি লুপের প্রয়োজন হয়।
স্লাই

আপনি 2013 থেকে মূল্য নিতে পারেন - জেসিকা কের - অবজেক্ট-ওরিয়েন্টড বিকাশকারীদের জন্য কার্যকরী মূলনীতি । লিনক 33 মিনিটের চিহ্নের পরেই "ঘোষিত স্টাইল" শিরোনামে উপস্থাপনায় আসেন।
থেরোট

উত্তর:


139

for বনাম foreach

একটি সাধারণ বিভ্রান্তি রয়েছে যে এই দুটি কনস্ট্রাক্টস খুব একই রকম এবং উভয়ই এর মত বিনিময়যোগ্য:

foreach (var c in collection)
{
    DoSomething(c);
}

এবং:

for (var i = 0; i < collection.Count; i++)
{
    DoSomething(collection[i]);
}

উভয় কীওয়ার্ড একই তিনটি অক্ষর দ্বারা শুরু হয় তা অর্থহীনভাবে বোঝায় না, সেগুলি একই রকম। এই বিভ্রান্তি অত্যন্ত ত্রুটি-প্রবণ, বিশেষত নতুনদের জন্য। সংগ্রহের মাধ্যমে আইট্রেট করা এবং উপাদানগুলির সাথে কিছু করা এর সাথে করা হয় foreach; forআপনি এই কাজটি করছেন তা যদি না জেনে থাকে তবে এই উদ্দেশ্যে ব্যবহার করার দরকার নেই এবং ব্যবহার করা উচিত নয়

আসুন দেখুন একটি উদাহরণ সহ এটিতে কী সমস্যা রয়েছে। শেষে, আপনি ফলাফল সংগ্রহের জন্য ব্যবহৃত একটি ডেমো অ্যাপ্লিকেশনটির পুরো কোডটি খুঁজে পাবেন।

উদাহরণস্বরূপ, আমরা "বোস্টন" এর মুখোমুখি হওয়ার আগে, ডেটাবেস থেকে কিছু তথ্য লোড করছি, স্পষ্টভাবে অ্যাডভেঞ্চার ওয়ার্কের শহরগুলি, নাম অনুসারে অর্ডার করা হয়েছে। নিম্নলিখিত এসকিউএল কোয়েরি ব্যবহৃত হয়:

select distinct [City] from [Person].[Address] order by [City]

ডেটা ListCities()পদ্ধতি দ্বারা লোড করা হয় যা একটি প্রদান করে IEnumerable<string>foreachদেখতে দেখতে যা এখানে :

foreach (var city in Program.ListCities())
{
    Console.Write(city + " ");

    if (city == "Boston")
    {
        break;
    }
}

আসুন এটি একটি দিয়ে আবার লিখি for, ধরে নিই যে উভয়ই বিনিময়যোগ্য:

var cities = Program.ListCities();
for (var i = 0; i < cities.Count(); i++)
{
    var city = cities.ElementAt(i);

    Console.Write(city + " ");

    if (city == "Boston")
    {
        break;
    }
}

উভয়ই একই শহরে ফিরে আসে, তবে একটি বিশাল পার্থক্য রয়েছে।

  • ব্যবহার করার সময় foreach, ListCities()এক সময় বলা হয় এবং 47 টি আইটেম দেয়।
  • ব্যবহার করার সময় for, ListCities()এটি 94 বার বলা হয় এবং সামগ্রিকভাবে 28153 আইটেম দেয়।

কি হলো?

IEnumerableহয় অলস । এর অর্থ হল যে ফলাফলটি যখন প্রয়োজন তখন কেবল এই মুহূর্তে কাজটি করে। অলস মূল্যায়ন একটি খুব দরকারী ধারণা, তবে এর কিছু মুহূর্ত রয়েছে যাতে এই মুহূর্ত (গুলি) মিস করা সহজ যেখানে ফলাফলের প্রয়োজন হবে, বিশেষত এমন ক্ষেত্রে যেখানে ফলাফল একাধিকবার ব্যবহৃত হয়।

একটি ক্ষেত্রে foreach, ফলাফল একবারেই অনুরোধ করা হয়। একটি একটি যদি for উপরে ভুল লিখিত কোডে হিসাবে প্রয়োগ করা , ফলে অনুরোধ 94 বার , অর্থাত্ 47 × 2:

  • প্রতিবার cities.Count()বলা হয় (47 বার),

  • প্রতিবার cities.ElementAt(i)বলা হয় (47 বার)

একের পরিবর্তে একটি ডাটাবেসকে 94 বার জিজ্ঞাসা করা ভয়ানক, তবে ঘটতে পারে এমন খারাপ জিনিস নয়। উদাহরণস্বরূপ কল্পনা করুন, যদি selectক্যোয়ারির আগে টেবিলের মধ্যে একটি সারি সন্নিবেশ করানো হয় এমন কোনও ক্যোয়ারির আগে কী হয়। ঠিক আছে, আমাদের কাছে এমনটি রয়েছে forযা আশা করি আগে ক্র্যাশ না করা হলে ডাটাবেসটি 2,147,483,647 বার কল করবে ।

অবশ্যই, আমার কোড পক্ষপাতদুষ্ট। আমি ইচ্ছাকৃতভাবে আলস্য ব্যবহার করেছি IEnumerableএবং বারবার কল করার জন্য এটি লিখেছিলাম ListCities()। যে কেউ সূচনা করতে পারে যে কোনও শিক্ষানবিস কখনই এটি করতে পারে না, কারণ:

  • দ্য IEnumerable<T>সম্পত্তি নেই Count, কিন্তু শুধুমাত্র পদ্ধতি Count()। কোনও পদ্ধতিকে কল করা ভয়ঙ্কর, এবং কেউ আশা করতে পারে যে এর ফলাফলটি ক্যাশে হবে না এবং কোনও for (; ...; )ব্লকের পক্ষে উপযুক্ত নয় ।

  • সূচকের জন্য অনুপলব্ধ IEnumerable<T>এবং ElementAtলিনকিউ এক্সটেনশন পদ্ধতিটি খুঁজে পাওয়া সুস্পষ্ট নয় ।

সম্ভবত সবচেয়ে নতুনদের শুধু ফল রূপান্তর হবে ListCities()কিছু তারা সঙ্গে পরিচিত, একটি মত List<T>

var cities = Program.ListCities();
var flushedCities = cities.ToList();
for (var i = 0; i < flushedCities.Count; i++)
{
    var city = flushedCities[i];

    Console.Write(city + " ");

    if (city == "Boston")
    {
        break;
    }
}

তবুও, এই কোডটি foreachবিকল্পের থেকে খুব আলাদা । আবার এটি একই ফলাফল দেয় এবং এবার ListCities()পদ্ধতিটি কেবল একবার বলা হয় তবে 575 টি আইটেম দেয়, যখন foreachএটি কেবল 47 টি আইটেম দেয়।

পার্থক্যটি এমন তথ্য থেকে আসে যে ToList()কারণে ডেটাবেস থেকে সমস্ত ডেটা লোড হয়। foreach"বোস্টন" এর আগে কেবলমাত্র শহরগুলিকে অনুরোধ করার সময়, নতুনটির forজন্য সমস্ত শহর পুনরুদ্ধার করা এবং মেমরিতে সংরক্ষণ করা দরকার। 575 সংক্ষিপ্ত স্ট্রিং সহ, এটি সম্ভবত খুব বেশি পার্থক্য করে না, তবে আমরা যদি বিলিয়ন রেকর্ডযুক্ত টেবিল থেকে কেবল কয়েকটি সারি উদ্ধার করি?

তাহলে আসলে foreachকী?

foreachলুপ কাছাকাছি হয়। আমি আগে যে কোডটি ব্যবহার করেছি:

foreach (var city in Program.ListCities())
{
    Console.Write(city + " ");

    if (city == "Boston")
    {
        break;
    }
}

সহজেই প্রতিস্থাপন করা যেতে পারে:

using (var enumerator = Program.ListCities().GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        var city = enumerator.Current;
        Console.Write(city + " ");

        if (city == "Boston")
        {
            break;
        }
    }
}

উভয়ই একই আইএল উত্পাদন করে। উভয়ের একই ফল রয়েছে। উভয়ের একই পার্শ্ব প্রতিক্রিয়া রয়েছে। অবশ্যই এটি আবার whileএকই রকম অসীমতে আবার লেখা যেতে পারে forতবে এটি আরও দীর্ঘতর এবং ত্রুটি-প্রবণ হবে। আপনি যাকে আরও পাঠযোগ্য বলে বেছে নিতে বেছে নিতে পারেন free

এটি নিজে পরীক্ষা করতে চান? এখানে সম্পূর্ণ কোড:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;

public class Program
{
    private static int countCalls;

    private static int countYieldReturns;

    public static void Main()
    {
        Program.DisplayStatistics("for", Program.UseFor);
        Program.DisplayStatistics("for with list", Program.UseForWithList);
        Program.DisplayStatistics("while", Program.UseWhile);
        Program.DisplayStatistics("foreach", Program.UseForEach);

        Console.WriteLine("Press any key to continue...");
        Console.ReadKey(true);
    }

    private static void DisplayStatistics(string name, Action action)
    {
        Console.WriteLine("--- " + name + " ---");

        Program.countCalls = 0;
        Program.countYieldReturns = 0;

        var measureTime = Stopwatch.StartNew();
        action();
        measureTime.Stop();

        Console.WriteLine();
        Console.WriteLine();
        Console.WriteLine("The data was called {0} time(s) and yielded {1} item(s) in {2} ms.", Program.countCalls, Program.countYieldReturns, measureTime.ElapsedMilliseconds);
        Console.WriteLine();
    }

    private static void UseFor()
    {
        var cities = Program.ListCities();
        for (var i = 0; i < cities.Count(); i++)
        {
            var city = cities.ElementAt(i);

            Console.Write(city + " ");

            if (city == "Boston")
            {
                break;
            }
        }
    }

    private static void UseForWithList()
    {
        var cities = Program.ListCities();
        var flushedCities = cities.ToList();
        for (var i = 0; i < flushedCities.Count; i++)
        {
            var city = flushedCities[i];

            Console.Write(city + " ");

            if (city == "Boston")
            {
                break;
            }
        }
    }

    private static void UseForEach()
    {
        foreach (var city in Program.ListCities())
        {
            Console.Write(city + " ");

            if (city == "Boston")
            {
                break;
            }
        }
    }

    private static void UseWhile()
    {
        using (var enumerator = Program.ListCities().GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                var city = enumerator.Current;
                Console.Write(city + " ");

                if (city == "Boston")
                {
                    break;
                }
            }
        }
    }

    private static IEnumerable<string> ListCities()
    {
        Program.countCalls++;
        using (var connection = new SqlConnection("Data Source=mframe;Initial Catalog=AdventureWorks;Integrated Security=True"))
        {
            connection.Open();

            using (var command = new SqlCommand("select distinct [City] from [Person].[Address] order by [City]", connection))
            {
                using (var reader = command.ExecuteReader(CommandBehavior.SingleResult))
                {
                    while (reader.Read())
                    {
                        Program.countYieldReturns++;
                        yield return reader["City"].ToString();
                    }
                }
            }
        }
    }
}

এবং ফলাফল:

--- for ---
অ্যাবিংডন আলবানি আলেকজান্দ্রিয়া আলহামব্রা [...] বন বোর্দো বোস্টন

ডেটাটিকে 94 বার বলা হয়েছিল এবং 28153 আইটেম (গুলি) দেওয়া হয়েছিল।

--- তালিকা সহ ---
অ্যাবিংডন আলবানি আলেকজান্দ্রিয়া আলহাম্ব্রা [...] বন বোর্ডো বোস্টন

ডেটাটিকে 1 সময় বলা হয়েছিল এবং 575 টি আইটেম পাওয়া যায় yield

--- যখন ---
অ্যাবিংডন আলবানি আলেকজান্দ্রিয়া আলহাম্ব্রা [...] বন বোর্দো বোস্টন

ডেটাটিকে 1 সময় বলা হয়েছিল এবং 47 টি আইটেম পাওয়া যায়।

--- foreach ---
অ্যাবিংডন আলবানি আলেকজান্দ্রিয়া আলহাম্ব্রা [...] বন বোর্ডো বোস্টন

ডেটাটিকে 1 সময় বলা হয়েছিল এবং 47 টি আইটেম পাওয়া যায়।

লিনিকিউ বনাম traditionalতিহ্যবাহী পদ্ধতি

লিনকিউ হিসাবে, আপনি ক্রিয়ামূলক প্রোগ্রামিং (এফপি) শিখতে চাইতে পারেন - সি # এফপি স্টাফ নয়, তবে হাস্কেলের মতো বাস্তব এফপি ভাষা। কোডটি প্রকাশ করার এবং উপস্থাপনের জন্য কার্যকরী ভাষাগুলির একটি নির্দিষ্ট উপায় রয়েছে। কিছু পরিস্থিতিতে এটি অ-কার্যকরী দৃষ্টান্তের চেয়ে উচ্চতর।

FP অনেক উচ্চতর হচ্ছে পরিচিত যখন এটি (তালিকা সাধিত আসে না করা তালিকা একটি জেনেরিক শব্দ, এর সম্পর্কহীন হিসাবে List<T>)। এই সত্যটি দেওয়া, তালিকার বিষয়টি যখন আসে তখন আরও কার্যকরী উপায়ে সি # কোড প্রকাশ করার ক্ষমতাটি বরং একটি ভাল জিনিস।

যদি আপনি বিশ্বাসী না হন তবে বিষয়টিতে আমার পূর্ববর্তী উত্তরে ক্রিয়ামূলক এবং অ-কার্যকরী উভয় উপায়ে লিখিত কোডের পঠনযোগ্যতার তুলনা করুন ।


1
তালিকাসমূহ () উদাহরণ সম্পর্কে প্রশ্ন। কেন এটি কেবল একবার চালানো হবে? অতীতে ফলন ফেরতের তুলনায় আমার কোনও সমস্যা হয়নি।
দান্তে

1
তিনি এই কথাটি বলছেন না যে আপনি কেবলমাত্র ফলাফলের ফলাফল পেয়ে যাবেন - তিনি বলছেন যে এসকিউএল কোয়েরি (যা পদ্ধতির ব্যয়বহুল অংশ) কেবল একবার সম্পাদন করবে - এটি ভাল জিনিস। এরপরে এটি কোয়েরি থেকে সমস্ত ফলাফল পড়বে এবং ফল দেবে।
হ্যাপিগ্যাট

9
@ জর্জিও: যদিও এই প্রশ্নটি বোধগম্য, তবে কোনও ভাষার শব্দার্থবিজ্ঞান থাকলে তা কোনও শিক্ষানবিশকে কী বিভ্রান্তিকর মনে হতে পারে তা আমাদের খুব কার্যকর ভাষা দিয়ে ছাড়বে না।
স্টিভেন ইভার্স 16

4
লিনকুই কেবল সিনমেটিক চিনি নয়। এটি বিলম্বিত কার্যকরকরণ সরবরাহ করে। এবং আইকিউয়ারিয়েলগুলির ক্ষেত্রে (যেমন সত্তা ফ্রেমওয়ার্ক) কোয়েরিটি পুনরাবৃত্তি না হওয়া অবধি পাস করার ও রচনা করার অনুমতি দেয় (অর্থাত্ পুনরায় আইকিউয়েরেবলের যেখানে ক্লজ যুক্ত করা হবে তার ফলে পুনরাবৃত্তির সময় এসকিউএল সার্ভারে পাস হবে যেখানে ক্লজটি অন্তর্ভুক্ত করা হয়েছে সার্ভারে ফিল্টারিং অফলোড হচ্ছে)।
মাইকেল ব্রাউন

8
আমার এই উত্তরটি যতটা পছন্দ হয়েছে, আমি মনে করি উদাহরণগুলি কিছুটা সংকলিত। শেষের সংক্ষিপ্তসারটি সুপারিশ করে যে foreachতুলনায় আরও কার্যকর for, যখন বাস্তবে বৈষম্য ইচ্ছাকৃতভাবে ভাঙা কোডের ফলাফল। উত্তরের নিখরচায়তা নিজেকে পুনরুদ্ধার করে, তবে একজন সাধারণ পর্যবেক্ষক কীভাবে ভুল সিদ্ধান্তে আসতে পারেন তা সহজেই দেখা যায়।
রবার্ট হার্ভে

19

যদিও ইতিমধ্যে কিছু এবং পূর্বাভাসের মধ্যে পার্থক্য নিয়ে কিছু দুর্দান্ত প্রদর্শন রয়েছে। লিনকিউ-র ভূমিকার কিছু স্থূল ভুল বিবরণ রয়েছে।

লিনকিউ সিনট্যাক্স কেবল সি সিনট্যাকটিক চিনি নয় যা সি # এর সাথে একটি কার্যকরী প্রোগ্রামিংয়ের সমানতা দেয়। লিনিকিউ সি # এর সমস্ত বেনিফিট সহ কার্যকরী কনস্ট্রাক্ট সরবরাহ করে। আইলিস্টের পরিবর্তে আইনিউমেবল ফিরিয়ে দেওয়ার সাথে যুক্ত, লিনিকিউ পুনরাবৃত্তির স্থগিতাদেশ কার্যকর করে। লোকেরা এখন যা করেন তা হ'ল তাদের কাজগুলি থেকে একটি আইলিস্ট তৈরি এবং ফিরিয়ে আনতে

public IList<Foo> GetListOfFoo()
{
   var retVal=new List<Foo>();
   foreach(var foo in _myPrivateFooList)
   {
      if(foo.DistinguishingValue == check)
      {
         retVal.Add(foo);
      }
   }
   return retVal;
}

পরিবর্তে একটি বিলম্বিত গণনা তৈরি করতে ফলন ফেরতের বাক্য গঠন ব্যবহার করুন ।

public IEnumerable<Foo> GetEnumerationOfFoo()
{
   //no need to create an extra list
   //var retVal=new List<Foo>();
   foreach(var foo in _myPrivateFooList)
   {
      if(foo.DistinguishingValue == check)
      {
         //yield the match compiler handles the complexity
         yield return foo;
      }
   }
   //no need for returning a list
   //return retVal;
}

এখন পর্যন্ত আপনি টোললিস্ট বা পুনরাবৃত্তি না করা পর্যন্ত গণনাটি ঘটবে না। এবং এটি কেবল প্রয়োজন হিসাবে ঘটে (এখানে ফিবোনাচি একটি গণনা যা স্ট্যাক ওভারফ্লো সমস্যা নেই)

/**
Returns an IEnumerable of fibonacci sequence
**/
public IEnumerable<int> Fibonacci()
{
  int first, second = 1;
  yield return first;
  yield return second;
  //the 46th fibonacci number is the largest that
  //can be represented in 32 bits. 
  for (int i = 3; i < 47; i++)
  {
    int retVal = first+second;
    first=second;
    second=retVal;
    yield return retVal;
  }
}

ফিবোনাচি ফাংশনটির উপর একটি ভবিষ্যদ্বাণী সম্পাদন করা 46 এর ক্রমটি ফিরে আসবে you

var thirtiethFib=Fibonacci().Skip(29).Take(1);

যেখানে আমরা প্রচুর মজা পেতে পারি ল্যাম্বডা এক্সপ্রেশনগুলির জন্য ভাষাতে সমর্থন (আইকুয়েরিয়েবল এবং আইকিউরিপ্রাইডার কনস্ট্রাক্টসের সাথে মিলিত), এটি বিভিন্ন ডেটা সেটের বিপরীতে প্রশ্নের কার্যকরী রচনার অনুমতি দেয়, আইকুয়েরিপ্রোভাইডার উত্তীর্ণদের ব্যাখ্যা করার জন্য দায়বদ্ধ উত্সের উত্স এবং স্থানীয় উত্সগুলি ব্যবহার করে একটি ক্যোয়ারী তৈরি ও সম্পাদন)। আমি এখানে কৌতুকপূর্ণ কৌতুকপূর্ণ বিবরণে যাব না, তবে এখানে একটি এসকিউএল ক্যোয়ারী সরবরাহকারী কীভাবে তৈরি করবেন তা দেখিয়ে একটি ব্লগ পোস্ট রয়েছে series

সংক্ষেপে, আপনার ক্রিয়াকলাপের গ্রাহকরা একটি সাধারণ পুনরাবৃত্তি সম্পাদন করবেন এমন সময় আপনার আইলিস্টের চেয়ে মূল সংখ্যা ফিরে আসা পছন্দ করা উচিত। জটিল প্রশ্নগুলির প্রয়োজন না হওয়া পর্যন্ত কার্যকরকরণ স্থগিত করার জন্য লিনক-এর ক্ষমতাগুলি ব্যবহার করুন।


13

তবে আমি কোডটি কম এবং কম পঠনযোগ্য দেখতে পাচ্ছি

পাঠযোগ্যতা দর্শকের চোখে পড়ে। কিছু লোক বলতে পারে

var common = list1.Intersect(list2);

পুরোপুরি পাঠযোগ্য; অন্যরা বলতে পারে যে এটি অস্বচ্ছ, এবং পছন্দ করবে

List<int> common = new List<int>();
for(int i1 = 0; i1 < list1.Count; i1++)
{
    for(int i2 = 0; i2 < list2.Count; i2++)
    {
        if (list1[i1] == list2[i2])
        {
            common.Add(i1);
            break;
        }
    }
}

এটি কী পরিষ্কার হচ্ছে তা পরিষ্কার করার জন্য। আপনি আরও পাঠযোগ্য কিসের জন্য আমরা আপনাকে তা বলতে পারি না। তবে আমি এখানে যে উদাহরণটি তৈরি করেছি তাতে আপনি নিজের কিছু পক্ষপাত সনাক্ত করতে সক্ষম হবেন ...


28
সত্যি বলতে চাই যে লিনক উদ্দেশ্যটিকে উদ্দেশ্যমূলকভাবে আরও পঠনযোগ্য করে তোলে যখন লুপগুলি প্রক্রিয়াটিকে উদ্দেশ্যমূলকভাবে আরও পাঠযোগ্য করে তোলে।
জে কে।

16
আমি কারও কাছ থেকে আমার পক্ষে যত দ্রুত সম্ভব দৌড়াতে পারি যে আমাকে বলে যে ফরফের জন্য সংস্করণটি ছেদ করা সংস্করণের চেয়ে বেশি পঠনযোগ্য।
কোনামিমন

3
@ কেনামিমন - এটি "পাঠযোগ্যতা" সম্পর্কে ভাবার পরে কোনও ব্যক্তি কী কী সন্ধান করে তার উপর নির্ভর করে । জে.কের মন্তব্য এটিকে পুরোপুরি চিত্রিত করে। লুপটি আরও বেশি পঠনযোগ্য এই অর্থে যে আপনি সহজেই দেখতে পাচ্ছেন যে এটির ফলাফল কীভাবে পাওয়া যাচ্ছে, যখন লিনকিউ শেষ ফলাফলটি কী হতে হবে তা আরও পাঠযোগ্য ।
Shauna

2
এজন্য লুপটি বাস্তবায়নে চলে যায় এবং তারপরে আপনি সর্বত্র ইন্টারসেক্ট ব্যবহার করেন।
আর মার্টিনহো ফার্নান্দেস

8
@ শৌনা: অন্য কোনও কাজ করার পদ্ধতির অভ্যন্তরে লুপ সংস্করণটি কল্পনা করুন; এটি একটি জগাখিচুড়ি. সুতরাং, স্বাভাবিকভাবেই, আপনি এটিকে নিজস্ব পদ্ধতিতে বিভক্ত করেছেন। পঠনযোগ্যতা অনুসারে, এটি আইনিউমেন্টেবল <T> এর মতোই .আরঙ্কিত করুন, তবে এখন আপনি কাঠামোর কার্যকারিতা ডুপ্লিকেট করেছেন এবং বজায় রাখতে আরও কোড প্রবর্তন করেছেন। একমাত্র অজুহাত যদি আপনার আচরণগত কারণে কাস্টম বাস্তবায়নের প্রয়োজন হয় তবে আমরা এখানে কেবল পঠনযোগ্যতার কথা বলছি।
Misko

7

লিনকুইয়ের মধ্যে পার্থক্যটি foreachসত্যিকার অর্থে দুটি পৃথক প্রোগ্রামিং শৈলীতে ফোটে : আবশ্যক এবং ঘোষণামূলক।

  • আবশ্যক: এই স্টাইলে আপনি কম্পিউটারকে বলুন "এটি করুন ... এখন এটি করুন ... এখন এটি করুন এখন এটি করুন"। আপনি এটি একবারে একবারে একটি প্রোগ্রাম ফিড।

  • ঘোষণামূলক: এই স্টাইলে আপনি কম্পিউটারটি বলুন যে আপনি ফলাফলটি কী চান এবং এটি কীভাবে কীভাবে পাওয়া যায় তা এটিকে নির্ধারণ করতে দিন।

এই দুটি শৈলীর একটি সর্বোত্তম উদাহরণ এসকিউএল এর সাথে সমাবেশ কোড (বা সি) তুলনা করা। সমাবেশে আপনি একবারে নির্দেশাবলী (আক্ষরিক) দেন। এসকিউএলে আপনি কীভাবে একসাথে ডেটাতে যোগদান করবেন এবং সেই ডেটা থেকে আপনি কী ফলাফল চান তা প্রকাশ করেন express

ঘোষণামূলক প্রোগ্রামিংয়ের একটি দুর্দান্ত পার্শ্ব প্রতিক্রিয়া হ'ল এটি কিছুটা উচ্চতর স্তর হতে থাকে। এটি আপনাকে নিজের কোড পরিবর্তন না করে প্ল্যাটফর্মটির নীচে বিবর্তিত হওয়ার অনুমতি দেয়। এই ক্ষেত্রে:

var foo = bar.Distinct();

এখানে কি হচ্ছে? ডিস্টিন্ট কি একটি কোর ব্যবহার করছে? দুই? পঞ্চাশ? আমরা জানি না এবং আমরা যত্নও করি না। .NET ডেভসরা যে কোনও সময় এটি পুনরায় লিখতে পারে, যতক্ষণ না এটি একই উদ্দেশ্যে সঞ্চালন করে চলেছে কোনও কোড আপডেটের পরে আমাদের কোডটি যাদুগতভাবে দ্রুততর হতে পারে।

এটি কার্যকরী প্রোগ্রামিংয়ের শক্তি। এবং যে কারণে আপনি ক্লজিউর, এফ # এবং সি # (একটি কার্যকরী প্রোগ্রামিং মানসিকতার সাথে লিখিত) এর মতো ভাষাতে কোডটি খুঁজে পাবেন তার কারণটি প্রায়শই এটি অত্যাবশ্যক অংশগুলির তুলনায় 3x-10x ছোট হয়।

পরিশেষে আমি ঘোষণামূলক স্টাইলটি পছন্দ করি কারণ সি # এর বেশিরভাগ সময় এটি আমাকে কোড লিখতে দেয় যা ডেটা পরিবর্তন করে না। উপরের উদাহরণে, Distinct()বার পরিবর্তন হয় না, এটি ডেটার একটি নতুন অনুলিপি প্রদান করে। এর অর্থ হ'ল যে বারই হোক না কেন এবং এটি যেখান থেকে এসেছিল তা হঠাৎ পরিবর্তিত হয়নি।

অন্য পোস্টারদের মতো তাই বলা হচ্ছে, ফাংশনাল প্রোগ্রামিং শিখুন। এটি আপনার জীবন পরিবর্তন করবে। এবং যদি আপনি পারেন তবে এটি সত্যিকারের কার্যকরী প্রোগ্রামিং ভাষায় করুন। আমি ক্লজুরে পছন্দ করি তবে এফ # এবং হাস্কেলও দুর্দান্ত পছন্দ।


2
লিনকিউ প্রক্রিয়াজাতকরণ স্থগিত করা হয় যতক্ষণ না আপনি এটির উপরে প্রকৃতপক্ষে পুনরাবৃত্তি করেন। var foo = bar.Distinct()মূলত একটি হল IEnumerator<T>যতক্ষণ না আপনি কল .ToList()বা .ToArray()। এটি একটি গুরুত্বপূর্ণ পার্থক্য কারণ আপনি যদি সচেতন না হন তবে এটি বাগগুলি বুঝতে অসুবিধা হতে পারে।
বেরিন লরিটস

-5

দলের অন্যান্য বিকাশকারীরা লিনকিউ পড়তে পারেন?

যদি না হয় তবে এটি ব্যবহার করবেন না বা দুটি জিনিসের একটি ঘটবে:

  1. আপনার কোডটি অভাবনীয় হবে
  2. আপনার সমস্ত কোড এবং এটির উপর নির্ভর করে যা কিছু আছে তা বজায় রাখতে আপনি আটকে যাবেন

প্রতিটি লুপের জন্য একটি একটি তালিকার মাধ্যমে পুনরাবৃত্তি করার জন্য উপযুক্ত তবে এটি যদি আপনি না করেন তবে এটি ব্যবহার করবেন না।


11
হুঁ, আমি প্রশংসা করি যে একটি একক প্রকল্পের জন্য এটির উত্তর হতে পারে, তবে মাঝারি থেকে দীর্ঘমেয়াদী জন্য আপনার কর্মীদের প্রশিক্ষণ দেওয়া উচিত, অন্যথায় আপনার কোড বোধগমের নীচে একটি প্রতিযোগিতা রয়েছে যা ভাল ধারণা বলে মনে হয় না।
জে কে।

21
আসলে, তৃতীয় জিনিসটি ঘটতে পারে: অন্যান্য বিকাশকারীরা স্বল্প পরিমাণ প্রচেষ্টা করতে পারে এবং আসলে নতুন এবং দরকারী কিছু শিখতে পারে। এটা শোনা যায় না।
এরিক কিং

6
@ ইনভারটেডল্ল্যামা যদি আমি এমন কোনও সংস্থায় থাকি যেখানে বিকাশকারীদের নতুন ভাষার ধারণাটি বোঝার জন্য আনুষ্ঠানিক প্রশিক্ষণের প্রয়োজন হয় তবে আমি একটি নতুন সংস্থা সন্ধানের বিষয়ে ভাবছিলাম be
ওয়াইয়াট বার্নেট

13
সম্ভবত আপনি গ্রন্থাগারগুলির সাথে সেই মনোভাবটি থেকে দূরে সরে যেতে পারেন, তবে যখন এটি মূল ভাষার বৈশিষ্ট্যগুলির সাথে আসে, এটি এটি কেটে দেয় না। আপনি ফ্রেমওয়ার্ক বেছে নিতে এবং চয়ন করতে পারেন। তবে একটি ভাল নেট নেট প্রোগ্রামারকে ভাষার প্রতিটি বৈশিষ্ট্য এবং মূল প্ল্যাটফর্মের (সিস্টেম। *) বুঝতে হবে। এবং লিনক ব্যবহার না করে আপনি ইএফ সঠিকভাবে ব্যবহার করতে পারবেন না তা বিবেচনা করে, আমাকে বলতে হবে ... এই দিন এবং যুগে আপনি যদি নেট প্রোগ্রামার হন এবং আপনি লিনককে জানেন না, আপনি অক্ষম।
টিমোথি বাল্ড্রিজ

7
এটি ইতিমধ্যে যথেষ্ট ডাউনভিটস রয়েছে, সুতরাং আমি এতে যুক্ত করব না, তবে অজ্ঞ / অযোগ্য সহকর্মীদের সমর্থনকারী যুক্তিটি কখনই বৈধ নয়।
স্টিভেন ইভার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.