লিনকু দিয়ে অর্ডার সংরক্ষণ করা


361

আমি অর্ডার করা অ্যারেতে নির্দেশাবলী অবজেক্টগুলিতে লিনকিউ ব্যবহার করি। অ্যারের ক্রম পরিবর্তন করা হয়নি তা নিশ্চিত হওয়ার জন্য কোন ক্রিয়াকলাপগুলি আমার করা উচিত নয়?

উত্তর:


645

আমি সিস্টেমের পদ্ধতিগুলি পরীক্ষা করেছি in ফলাফলের ক্রম কীভাবে উত্সের ক্রম থেকে পৃথক হবে তা নির্ধারণ করতে আমি প্রত্যেকটির মন্তব্য পরীক্ষা করে দেখেছি।

পুরোপুরি অর্ডার সংরক্ষণ করে। আপনি কোনও ফলাফলের উপাদানের সূচকে একটি উত্স উপাদান মানচিত্র করতে পারেন

  • AsEnumerable
  • কাস্ট
  • CONCAT
  • নির্বাচন করা
  • ToArray
  • তালিকা

অর্ডার সংরক্ষণ করে। উপাদানগুলি ফিল্টার বা যুক্ত করা হয় তবে পুনরায় অর্ডার দেওয়া হয় না।

  • স্বতন্ত্র
  • ছাড়া
  • ছেদ
  • OfType
  • প্রস্তুতি (নেট। 4.7.1 এ নতুন)
  • এড়িয়ে
  • SkipWhile
  • গ্রহণ করা
  • TakeWhile
  • কোথায়
  • জিপ (। নেট 4 এ নতুন)

অর্ডার নষ্ট করে - কোন আদেশে ফলাফল আশা করা যায় তা আমরা জানি না।

  • ToDictionary
  • ToLookup

স্পষ্টভাবে আদেশ পুনরায় সংজ্ঞা করুন - ফলাফলের ক্রম পরিবর্তন করতে এগুলি ব্যবহার করুন

  • OrderBy
  • OrderByDescending
  • বিপরীত
  • তারপর দ্বারা
  • ThenByDescending

কিছু নিয়ম অনুসারে পুনরায় সংজ্ঞায়িত আদেশ।

  • গ্রুপবাই - আইগ্রুপিং অবজেক্টগুলি উত্সের উপাদানগুলির ক্রমের ভিত্তিতে একটি ক্রমে উত্পন্ন হয় যা প্রতিটি আইগ্রুপিংয়ের প্রথম কী তৈরি করে। গোষ্ঠীভুক্ত উপাদানগুলি উত্স অনুসারে যে ক্রম হিসাবে উপস্থিত হয় সেগুলি পাওয়া যায়।
  • গ্রুপজাইন - গ্রুপজাইন বাইরের উপাদানগুলির ক্রম সংরক্ষণ করে এবং বাইরের প্রতিটি উপাদানের জন্য অভ্যন্তর থেকে মিলিত উপাদানগুলির ক্রম সংরক্ষণ করে।
  • যোগদান - বাইরের উপাদানগুলির ক্রম সংরক্ষণ করে এবং এই প্রতিটি উপাদানের জন্য, অভ্যন্তরের মিলের উপাদানগুলির ক্রম।
  • সিলেক্টম্যানি - উত্সের প্রতিটি উপাদানগুলির জন্য, নির্বাচককে আমন্ত্রণ জানানো হয় এবং মানগুলির ক্রম ফিরে আসে।
  • ইউনিয়ন - যখন এই পদ্ধতিতে প্রত্যাবর্তিত বস্তুটি গণনা করা হয়, ইউনিয়ন সেই ক্রমে প্রথম এবং দ্বিতীয় গণনা করে এবং ইতিমধ্যে ফলিত হয়নি এমন প্রতিটি উপাদান দেয়।

সম্পাদনা: আমি এই প্রয়োগের উপর ভিত্তি করে ডিস্টিন্ট সংরক্ষণ সংরক্ষণে সরিয়ে নিয়েছি

    private static IEnumerable<TSource> DistinctIterator<TSource>
      (IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
    {
        Set<TSource> set = new Set<TSource>(comparer);
        foreach (TSource element in source)
            if (set.Add(element)) yield return element;
    }

2
আসলে, আমি মনে করি ডিস্টিন্ট মূল অর্ডার সংরক্ষণ করে (প্রথম পাওয়া) - সুতরাং {1,2,1,3,1,3,4,1,5 {হবে {1,2,3,4,5}
মার্ক গ্র্যাভেল

10
msdn.microsoft.com/en-us/library/bb348436.aspx স্বতন্ত্র <(<(TSource>) এর>) পদ্ধতি আয় একটি unordered ক্রম কোনো সদৃশ মান ধারণ করে (IEnumerable) <(<(TSource>) এর>) ।
অ্যামি বি

12
মার্ক: আপনি যা বলছেন তা সত্য হতে পারে তবে সেই আচরণের উপর নির্ভর করা খারাপ ধারণা হবে।
অ্যামি বি

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

4
হতে পারে ডকুমেন্টেশন ( Distinctপদ্ধতির জন্য ) কেবলমাত্র "অপ্রত্যাশিত ক্রমে" নয়, "অরসেটেড" বলতে বোঝায়। আমি বলতে চাই Distinctউপরের ফিল্টারিং বিভাগের অন্তর্ভুক্ত, ঠিক তেমন Where
জেপ্পে স্টিগ নীলসেন

34

আপনি কি আসলে এসকিউএল, বা অ্যারে সম্পর্কে কথা বলছেন? এটিকে অন্য উপায়ে বলতে কি আপনি লিনকিউ থেকে এসকিউএল বা লিনকিউ অবজেক্টে ব্যবহার করছেন?

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

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


সুতরাং যেহেতু অর্ডারবাই একটি স্থিতিশীল ধরণের, তারপরে: seq.OrderBy (_ => _.Key) উপাদানগুলিকে seq.GroupBy (_ => _.Key) হিসাবে ঠিক একই ক্রমে রাখবে e নির্বাচন করুন (_ => _) )। এটা কি ঠিক?
dmg

1
@ ডিএমজি: না, তা হবে না। শুধু GroupByঅনুসরণ SelectManyচাবি দ্বারা গ্রুপকৃত ফলাফল দেবে, কিন্তু না কী অর্ডার আরোহী মধ্যে ... এটা যে ক্রমে কী মূলত ঘটেছে তাদের দিতে হবে।
জন স্কিটি

আপনি কি বলছেন যে লিনকিউ থেকে এসকিউএল সংরক্ষণের আদেশ দেয় না?
প্রতীক

@symbiont: অনেক SQL এর অপারেশন সেখানে হয় কোন ভাল-সংজ্ঞায়িত অর্ডার দিয়ে শুরু করতে। মূলত আমি কেবল গ্যারান্টি দিতে পারি এমন জিনিসগুলি সম্পর্কে প্রতিশ্রুতি দেওয়ার চেষ্টা করছি - যেমন লাইনকিউ অব অবজেক্টস।
জন স্কিটে

@ জোনস্কিট যদি আমি অর্ডারবাই ব্যবহার করি তবে এটি কী গ্যারান্টি দেয় যে একই কীযুক্ত 'এন' অবজেক্টগুলি তাদের আসল ক্রমটি সংরক্ষণ করবে তারা ব্যতীত তারা সবাই একসাথে। যেমন: list<x> {a b c d e f g}সি, ডি, ই সবার মধ্যে একই কী থাকে তবে ফলাফলের ক্রমটিতে সি, ডি, ই থাকবে এবং একে অপরের পাশে এবং ক্রমে সি, ডি, ই থাকবে। আমি এমএস-ভিত্তিক একটি শ্রেণিবদ্ধ উত্তর খুঁজে পাচ্ছি না।
পলাস্ট্রিয়াস

7

আপনি যদি একটি অ্যারে নিয়ে কাজ করছেন তবে মনে হচ্ছে আপনি লিনকিউ-টু-অবজেক্টগুলি ব্যবহার করছেন, এসকিউএল নয়; আপনি কি নিশ্চিত? বেশিরভাগ লিনকিউ অপারেশনগুলি কোনও কিছুর পুনরায় অর্ডার দেয় না (আউটপুটটি ইনপুট হিসাবে একই ক্রমে হবে) - সুতরাং অন্য সাজানোর প্রয়োগ করবেন না (অর্ডারবাই [অবরোহক] / তারপরে [অবরুদ্ধ]]।

[সম্পাদনা করুন: জন যেমন আরও স্পষ্টভাবে বলেছেন; লিনকিউ মূল তথ্য একা রেখে সাধারণত একটি নতুন ক্রম তৈরি করে]

নোট করুন যে কোনও Dictionary<,>(টুডে অভিধান) এ ডেটা চাপানো ডেটা স্ক্যাম্বল করবে, কারণ অভিধানটি কোনও নির্দিষ্ট সাজানোর ক্রমকে সম্মান করে না।

তবে সর্বাধিক সাধারণ জিনিসগুলি (নির্বাচন করুন, কোথায়, এড়িয়ে যান, নিন) ভাল হওয়া উচিত।


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

4

আমি অনুরূপ একটি প্রশ্নে একটি দুর্দান্ত উত্তর পেয়েছি যা অফিসিয়াল ডকুমেন্টেশনের উল্লেখ করে। এটি উদ্ধৃত করার জন্য:

জন্য Enumerableপদ্ধতি (বস্তু LINQ, যা প্রযোজ্য List<T>), আপনি দ্বারা ফিরে উপাদানের ক্রম উপর নির্ভর করতে পারেন Select, Whereঅথবা GroupBy। অন্তর্নিহিত পছন্দ মতো ToDictionaryবা আনর্ডারড এমন জিনিসগুলির ক্ষেত্রে এটি নয় Distinct

গণনাকারী থেকে.গ্রুপবাই ডকুমেন্টেশন থেকে :

IGrouping<TKey, TElement>বস্তু উৎস উপাদান প্রতিটি প্রথম কী উত্পাদিত ক্রম উপর ভিত্তি করে একটি অনুক্রমে পাওয়া হয় IGrouping<TKey, TElement>। একটি গোষ্ঠী উপাদান অর্ডার তারা প্রদর্শিত হল করছে source

এটি IQueryableএক্সটেনশন পদ্ধতির জন্য (অন্যান্য লিনকিউ সরবরাহকারী) প্রয়োজনীয়ভাবে সত্য নয় ।

উত্স: লিনকিউ এর উল্লেখযোগ্য পদ্ধতিগুলি উপাদানগুলির আপেক্ষিক ক্রম বজায় রাখে?


2

যে কোনও 'গ্রুপ বাই' বা 'অর্ডার বাই' সম্ভবত অর্ডার পরিবর্তন করবে।


0

এখানে প্রশ্নটি বিশেষত LINQ-to-অবজেক্টগুলিকে উল্লেখ করছে।

আপনি যদি এর পরিবর্তে লিনিক্যু-টু এসকিউএল ব্যবহার করেন তবে কোনও আদেশ নেই যদি না আপনি যদি এমন কিছু দিয়ে চাপিয়ে দেন:

mysqlresult.OrderBy(e=>e.SomeColumn)

আপনি যদি লিনিক্যু-টু-এসকিউএল দিয়ে এটি না করেন তবে ফলাফলের ক্রম পরবর্তী প্রশ্নগুলির মধ্যে এমনকি একই ডেটাতেও পৃথক হতে পারে, যা একটি মধ্যবর্তী বাগের কারণ হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.