অভিধানে উপাদানগুলির ক্রম


107

আমার প্রশ্ন অভিধানের উপাদানগুলি গণনা সম্পর্কে

// Dictionary definition
private Dictionary<string, string> _Dictionary = new Dictionary<string, string>();

// add values using add

_Dictionary.Add("orange", "1");
_Dictionary.Add("apple", "4");
_Dictionary.Add("cucumber", "6");

// add values using []

_Dictionary["banana"] = 7;
_Dictionary["pineapple"] = 7;

// Now lets see how elements are returned by IEnumerator
foreach (KeyValuePair<string, string> kvp in _Dictionary)
{
  Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value));
}

উপাদানগুলিকে কোন ক্রমে গণনা করা হবে? আমি কি আদেশটিকে বর্ণানুক্রমিক হতে বাধ্য করতে পারি?


উত্তর:


125

একটি অভিধানে উপাদানগুলির ক্রমটি হ'ল নির্দোষ। অর্ডার ধারণাটি হ্যাশ টেবিলের জন্য সংজ্ঞায়িত নয়। সুতরাং অভিধানে উপাদানগুলি যুক্ত হওয়ার সাথে একই ক্রমে গণনার উপর নির্ভর করবেন না। এটা গ্যারান্টিযুক্ত না।

দস্তাবেজের উদ্ধৃতি :

গণনার উদ্দেশ্যে, অভিধানের প্রতিটি আইটেমকে KeyValuePair<TKey, TValue>একটি মান এবং এর কী উপস্থাপন করে এমন কাঠামো হিসাবে বিবেচনা করা হয়। আইটেমগুলি যে ক্রমে ফিরে আসে তা নির্ধারিত।



28

আপনি যদি আদেশকৃত উপাদানগুলি চান তবে একটি অর্ডারড অভিধান ব্যবহার করুন । একটি সাধারণ তাড়াতাড়ি / অভিধান কেবল স্টোরেজ বিন্যাসের কিছু অর্থে অর্ডার করা হয়।


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

2
প্রশ্নটি বর্ণানুক্রমিক ক্রমে অর্ডার দেওয়ার বিষয়ে জিজ্ঞাসা করছে (ধরে নিচ্ছেন যে প্রশ্নকর্তা কী সম্পর্কে কথা বলছেন)। একটি আদেশযুক্ত অভিধান, যদি আমি ডকুমেন্টেশনটি সঠিকভাবে বুঝতে পারি তবে সেগুলি সন্নিবেশ করা হয় এমন উপাদানগুলিকে ক্রমবর্ধমানভাবে ফুটিয়ে তুলবে, অর্থাত্ বর্ণমালা নয়, অভ্যন্তরীণ সূচক ব্যবহার করে using একটি সাজানো অভিধান সম্ভবত ব্যবহারকারীর প্রশ্নের উপযুক্ত উপযুক্ত's
ম্যাটটিএম

28

আপনি সর্বদা এটির SortedDictionaryজন্য ব্যবহার করতে পারেন । নোট করুন যে অভিধানটি কী দ্বারা আদেশ করা হয়েছে, ডিফল্টরূপে, যদি না কোনও তুলনামূলক নির্দিষ্ট করা থাকে।

OrderedDictionaryআপনি যা চান তা ব্যবহারের বিষয়ে আমি সংশয়ী যেহেতু ডকুমেন্টেশন বলে যে:

অর্ডারডোরিয়ানের উপাদানগুলি একটি বাছাই করা অভিধানের শ্রেণীর উপাদানগুলির থেকে আলাদা করে কী দ্বারা বাছাই করা হয় না।


এটি SortedDictionary<K,V>বাইনারি অনুসন্ধান ট্রি হিসাবে বাস্তবায়িত হয়েছে তা লক্ষ করা গুরুত্বপূর্ণ , যা হ্যাশটেবল-ভিত্তিকের তুলনায় এর ক্রিয়াকলাপগুলিকে বিভিন্ন সময় এবং স্থান জটিলতা দেয় Dictionary<K,V>। যদি ব্যবহারকারীদের O(1)হ্যাশটেবল কাঠামো একটি সন্নিবেশ / মুছতে এবং কী-ক্রমের উপাদানগুলির উপরে পুনরাবৃত্তি করতে চান তবে তাদের dict.Keys.OrderBy( k => k ).Select( k => dict[k] )পরিবর্তে ( O(n)স্থান এবং O( n log n )সময় ব্যয়ে ) করা উচিত OrderBy()(যা কোনও অভ্যন্তরীণ তালিকায় পুরো কী সংগ্রহগুলি বাফার করতে হবে ) )।
দাই

12

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

আপনি আইটেমগুলি গণনার সময় অর্ডার করতে পারেন:

foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) {
  ...
}

ফ্রেম ২.০ এ আপনাকে প্রথমে আইটেমগুলি একটি তালিকাতে রাখতে হবে যাতে সেগুলি সাজানোর জন্য:

List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary);
items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); });
foreach (KeyValuePair<string,string> kvp in items) {
  ...
}

11

অর্ডারড অভিধানের জন্য:

 var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary();

_OrderedDictionary.Add("testKey1", "testValue1");
_OrderedDictionary.Add("testKey2", "testValue2");
_OrderedDictionary.Add("testKey3", "testValue3");

var k = _OrderedDictionary.Keys.GetEnumerator();
var v = _OrderedDictionary.Values.GetEnumerator();

while (k.MoveNext() && v.MoveNext()) {
    var key = k.Current; var value = v.Current;
}

আইটেমগুলি ক্রমযুক্ত যাতে তারা যুক্ত হয়।


5

সহযোগী অ্যারেগুলি (ওরফে, হ্যাশ টেবিলগুলি) আনঅর্ডার্ড করা হয়েছে যার অর্থ উপাদানগুলি কোনওভাবেই কল্পনাযোগ্যভাবে অর্ডার করা যেতে পারে।

তবুও, আপনি অ্যারে কীগুলি (কেবল কীগুলি) আনতে পারেন, বর্ণানুক্রমিকভাবে আদেশ করতে পারেন (সাজানোর ক্রিয়াটির মাধ্যমে) এবং তারপরে এটিতে কাজ করতে পারেন work

আমি আপনাকে সি # নমুনা দিতে পারি না কারণ আমি ভাষা জানি না, তবে আপনার নিজের পক্ষে যাওয়ার জন্য এটি যথেষ্ট হওয়া উচিত।

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