আপনি কীভাবে একটি মানকে মান অনুসারে বাছাই করবেন?


796

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

একটা হল SortedListযা একটি একক মান (বলুন ফ্রিকোয়েন্সি) জন্য ভাল, আমি এটা ফেরত শব্দ ম্যাপ করতে চান।

কী অনুসারে সাজানো অভিধানের অর্ডার, মান নয়। কিছু একটি কাস্টম ক্লাসে অবলম্বন করে , তবে কি কোনও ক্লিনার আছে?


1
কেবল অভিধানটি বাছাই করা (স্বীকৃত উত্তরের মতো), আপনি কেবল একটি IComparerকৌশলও তৈরি করতে পারেন যা ট্রিক করে তোলে (এটি সত্য যে এটি তুলনা করার জন্য একটি কী গ্রহণ করে তবে একটি কী দিয়ে আপনি একটি মান পেতে পারেন)। ;-)
BrainSlugs83

উত্তর:


520

ব্যবহার করুন:

using System.Linq.Enumerable;
...
List<KeyValuePair<string, string>> myList = aDictionary.ToList();

myList.Sort(
    delegate(KeyValuePair<string, string> pair1,
    KeyValuePair<string, string> pair2)
    {
        return pair1.Value.CompareTo(pair2.Value);
    }
);

যেহেতু আপনি .NET 2.0 বা তত উপরে লক্ষ্যবস্তু করছেন তাই আপনি এটিকে ল্যাম্বদা সিনট্যাক্সে সরল করতে পারেন - এটি সমতুল্য, তবে কম। আপনি .NET 2.0 কে টার্গেট করছেন যদি আপনি ভিজ্যুয়াল স্টুডিও ২০০৮ (বা তারপরের) এর সংকলক ব্যবহার করেন তবে আপনি কেবল এই সিনট্যাক্সটি ব্যবহার করতে পারেন।

var myList = aDictionary.ToList();

myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));

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

113
এটি এক লাইনার - আপনার ধনুর্বন্ধনী প্রয়োজন নেই। এটি আবার লেখা যেতে পারেmyList.Sort((x,y)=>x.Value.CompareTo(y.Value));
অ্যারিস ল্যাপসা

25
X এবং y এর তুলনা অনুসারে উত্থিত স্যুইচ করতে: myList.Sort ((x, y) => y.Value.CompareTo (x.Value));
আর্টুরো

8
আমি মনে করি এটি লক্ষণীয় যে এটির জন্য টোললিস্ট এক্সটেনশন পদ্ধতির জন্য লিনক প্রয়োজন।
বেন

17
আপনি ছেলেরা এটিকে জটিল করার জন্য অপেক্ষা করছেন - একটি অভিধান ইতিমধ্যে প্রয়োগ করেছে IEnumerable, সুতরাং আপনি এর মতো বাছাই করা তালিকা পেতে পারেন:var mySortedList = myDictionary.OrderBy(d => d.Value).ToList();
BrainSlugs83

523

লিনকিউ ব্যবহার করুন:

Dictionary<string, int> myDict = new Dictionary<string, int>();
myDict.Add("one", 1);
myDict.Add("four", 4);
myDict.Add("two", 2);
myDict.Add("three", 3);

var sortedDict = from entry in myDict orderby entry.Value ascending select entry;

এটি শীর্ষ নমনীয়তার জন্যও আপনাকে অনুমতি দেয় যে আপনি শীর্ষ 10, 20 10% ইত্যাদি নির্বাচন করতে পারেন বা আপনি যদি নিজের শব্দ ফ্রিকোয়েন্সি সূচকটি ব্যবহার করে থাকেন তবে আপনি ধারাটিও type-aheadঅন্তর্ভুক্ত করতে পারেন StartsWith


15
আমি কীভাবে সাজানো ডিক্টিকে আবার কোনও অভিধান <স্ট্রিং, ইন> এ পরিবর্তন করতে পারি? এখানে নতুন তাই প্রশ্ন পোস্ট করা: stackoverflow.com/questions/3066182/...
Kache

1
দুঃখজনকভাবে এটি VS2005 এ কাজ করে না কারণ সেখানে নেট নেট ফ্রেমওয়ার্ক 2.0 (কোনও লিনকিউ নেই)। বামব্রিকের উত্তরও রাখা ভাল।
স্মটকাট

22
আমি নিশ্চিত না যে এটি সর্বদা কাজ করে কিনা কারণ অভিধানের মাধ্যমে পুনরাবৃত্তি করা গ্যারান্টি দেয় না যে কীভ্যালু পেয়ারগুলি inোকানো হয়েছে একই ক্রমে "টানা" রয়েছে। তবে, আপনি লিনকিউতে অর্ডারবাই ব্যবহার করছেন কিনা তা বিবেচ্য নয় কারণ অভিধান সন্নিবেশ করা উপাদানের ক্রম পরিবর্তন করতে পারে। এটি সাধারণত প্রত্যাশার মতো কাজ করে তবে কোনও গ্যারান্টি নেই, বিশেষত বড় অভিধানগুলির জন্য।
বোজিদার সোবকজাক

16
রিটার্ন টাইপ হওয়া উচিত IEnumerable<KeyValuePair<TKey, TValue>>বা একটি OrderedDictionary<TKey, TValue>। অথবা একটি SortedDictionaryশুরু থেকে একটি ব্যবহার করা উচিত । একটি সমভূমির Dictionaryজন্য এমএসডিএন স্পষ্টভাবে বলে "আইটেমগুলি যে ক্রমে ফিরে আসে তা অপরিজ্ঞাত।" দেখে মনে হচ্ছে @ rythos42- র সর্বশেষ সম্পাদনাটি দোষ দেওয়া। :)
বরিস বি।


254
var ordered = dict.OrderBy(x => x.Value);

6
আমি নিশ্চিত না যে এই সমাধানটি কেন বেশি জনপ্রিয় নয় - সম্ভবত এটির জন্য নেট নেট দরকার?
কনটাঙ্গো

33
এটি একটি ভাল সমাধান, তবে এটির আধিকারিক-শেষ হওয়ার আগে এই অধিকার থাকা উচিত: .ToD शब्दकोয় (জোড় => জোড়.কি, জোড় => জোড়া.ভ্যালু);
জের্ম্ম

3
@ জর্মে বাছাই করা আইটেমগুলি একটি অভিধানে রেখে আবার অর্ডার কি গ্যারান্টিযুক্ত? এটি আজ কাজ করতে পারে তবে এটির নিশ্চয়তা নেই।
নওফাল

1
4.5 ফ্রেমওয়ার্কটি ব্যবহার করে, কেবল যাচাই করা হয়েছে যে এর অভিধানে আবার কোনও কাস্ট প্রয়োজন হয় না
জাগড

12
অভিধানের অর্ডার না থাকায় কোনও অভিধানে কাস্ট করা উচিত নয়। কীভ্যালু পেয়ারগুলি আপনার পছন্দ অনুযায়ী ক্রমে থাকবে এমন কোনও গ্যারান্টি নেই।
ডেভিড DeMar

165

চারপাশে সন্ধান করা এবং কয়েকটি সি # 3.0 বৈশিষ্ট্য ব্যবহার করে আমরা এটি করতে পারি:

foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{ 
    // do something with item.Key and item.Value
}

এটি আমি দেখতে সবচেয়ে পরিষ্কার উপায় এবং হ্যাশগুলি পরিচালনা করার রুবি পদ্ধতির অনুরূপ।


আমি একটি কম্বোবক্সে কীভ্যালু পেয়ার যুক্ত করার সময় একটি অভিধানকে বাছাই করার চেষ্টা করছিলাম ... এটি দুর্দান্ত কাজ করেছে! ধন্যবাদ!
জেসন ডাউন

6
এই সিনট্যাক্সটি ব্যবহার করার সময় সিস্টেম.লিংক নামস্থান যুক্ত করতে ভুলবেন না।
এম ডুডলি

4
(for KeyValuePair<string, int> item in keywordCounts.OrderBy(key => key.Value) select item).ToDictionary(t => t.Key, t => t.Value)- আপনার উত্তরের জন্য একটি সামান্য সংযোজন :) ধন্যবাদ, বিটিডব্লিউ :)
অ্যান্ড্রিয়াস নারুয়েভিয়াস

7
@ AndriusNaruševičius: আপনি যদি কোনও ফলাফলগুলিতে ফলস্বরূপ আইটেমগুলি আবার যোগ করেন তবে আপনি ক্রমটি নষ্ট করবেন, কারণ অভিধানগুলি কোনও নির্দিষ্ট ফ্যাশনে অর্ডার দেওয়ার গ্যারান্টিযুক্ত নয়
বা ম্যাপার

এটা সহজ ছিল। এটি অন্যভাবে যেতে কীভাবে উল্টে যায়?
ড্যান হেস্টিংস

158

আপনি একটি মানকে মান অনুসারে বাছাই করতে পারেন এবং এটিকে নিজের কাছে আবার সংরক্ষণ করতে পারেন (যাতে আপনি যখন এটির পূর্বে ভবিষ্যদ্বাণী করেন তখন মানগুলি যথাযথভাবে প্রকাশিত হয়):

dict = dict.OrderBy(x => x.Value).ToDictionary(x => x.Key, x => x.Value);

অবশ্যই, এটি সঠিক নাও হতে পারে তবে এটি কাজ করে।


8
আপনি যদি একটি উত্থানের তালিকায় বাছাই করতে চান তবে আপনি অর্ডারবাইডেসেন্ডিংও ব্যবহার করতে পারেন।
মেনডোকুশাই

আমার জন্য কাজ করেছে, যদিও আমাকে এটিকে কিছুটা পরিবর্তন করতে হয়েছিল: অভিধান <কী, মান> ডিক্ট = ডিক্টর rdআর্ডারবি (x => x.Value) o
জোশ

17
এই "কাজ" গ্যারান্টিযুক্ত নয়। এটি একটি বাস্তবায়ন বিশদ। এটি অন্য সময় কাজ করার দরকার নেই। ভুল উত্তর, নিম্নমানের।
নওফাল

4
অভিধানের আউটপুটটিতে কোনও নির্দিষ্ট ক্রমের অর্ডার থাকার নিশ্চয়তা নেই।
রজার উইলককস

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

61

একটি উচ্চ স্তরে, পুরো অভিধানটি দিয়ে চলার এবং প্রতিটি মানটি দেখার জন্য আপনার কাছে অন্য কোনও বিকল্প নেই।

হতে পারে এটি সহায়তা করে: http://bytes.com/forum/thread563638.html জন টিমনি থেকে অনুলিপি / আটকানো:

Dictionary<string, string> s = new Dictionary<string, string>();
s.Add("1", "a Item");
s.Add("2", "c Item");
s.Add("3", "b Item");

List<KeyValuePair<string, string>> myList = new List<KeyValuePair<string, string>>(s);
myList.Sort(
    delegate(KeyValuePair<string, string> firstPair,
    KeyValuePair<string, string> nextPair)
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);

3
স্ট্রিংেক্সট পেয়ার -> স্ট্রিং> নেক্সট পেয়ার স্ট্রিংফিস্ট পেয়ার -> স্ট্রিং> ফার্স্ট পেয়ার
আর্ট

2
পারফেক্ট নন-লিংক সমাধান। সমস্যা সমাধানের জন্য একেবারে প্রয়োজন না হলেও লিনক ব্যবহার করার প্রয়োজনীয়তা লোকেরা কীভাবে অনুভব করে তা আমাকে বিস্মিত করে না। সি # 3 দিয়ে, আমি বিশ্বাস করি যে আপনি কেবল একটি ল্যাম্বডা ব্যবহার করতে বাছাইটিকে সহজ করতে পারেন: মাইলিস্ট.সর্ট ((x, y) => x.Value.CompareTo (y.Value));

25

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


2
একটি বাছাই করা অভিধান যদিও কী-মান জোড়গুলির একটি তালিকা দিতে পারে।
পুনরাবৃত্তি

1
@ রিসার্সিভ যে কোনও অভিধানে এটি পাওয়া উচিত। আকর্ষণীয় যে আমার উত্তরটি, যা সঠিক, তবে অসম্পূর্ণ (আরও ভাল উদাহরণগুলি যা করতে পারত) এটি একটি অবৈধ উত্তরের নীচে ভোট দেওয়া হয়েছে যার ফলস্বরূপ মূল অভিধানে সদৃশ মানগুলিতে ব্যতিক্রম হবে (কীগুলি অনন্য, মানগুলি গ্যারান্টিযুক্ত নয়) হতে হবে)
রজার উইলককস

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

@ নেটমেজ হ্যাঁ তবে সমস্যার অপর অংশটি হ'ল তারা মান অনুসারে আদেশ করেছিলেন। এবং আপনি কেবল কী এবং মান অদলবদল করে এটি করতে পারেন। এবং মান অগত্যা অনন্য নয়, তবে কী অবশ্যই হবে।
রজার উইলককস

হ্যাঁ, তবে আমি মনে করি যে এতে আপনার সম্পূর্ণ উত্তরটি ভুল রয়েছে the
নেটমেজ

21

আপনি অভিধানে এন্ট্রি বাছাই করবেন না। .NET এ অভিধানের ক্লাসটি হ্যাশটেবল হিসাবে প্রয়োগ করা হয় - এই ডেটা কাঠামো সংজ্ঞা অনুসারে বাছাইযোগ্য নয়।

আপনার সংগ্রহ (পুনরুদ্ধার করে) এর মাধ্যমে যদি আপনার পুনরাবৃত্তি করতে সক্ষম হয় - আপনার সোর্টার্ড ডিকোরিয়ানোটি ব্যবহার করতে হবে যা বাইনারি অনুসন্ধান ট্রি হিসাবে প্রয়োগ করা হয়।

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

আপনি কেন আপনার মূল / প্রথম অভিধানটিতে মূল আইটেমটির লিঙ্ক বজায় রাখতে জোর দিয়েছিলেন তা আমি বুঝতে পারি না।

যদি আপনার সংগ্রহে থাকা বস্তুগুলির আরও জটিল কাঠামো (আরও ক্ষেত্র) থাকে এবং আপনি কী হিসাবে বিভিন্ন ক্ষেত্রকে দক্ষতার সাথে অ্যাক্সেস করতে / সাজাতে সক্ষম হবেন - আপনার সম্ভবত সম্ভবত একটি কাস্টম ডেটা কাঠামো দরকার যা মূল স্টোরেজটি ধারণ করে যে ও (1) সন্নিবেশ এবং অপসারণ (লিংকডলিস্ট) এবং বেশ কয়েকটি সূচী কাঠামো - অভিধান / সোর্টার্ডডিকোরিয়ান্স / সোর্টার্ডগুলি সমর্থন করে। এই সূচকগুলি আপনার জটিল শ্রেণীর একটি ক্ষেত্রকে কী হিসাবে এবং লিঙ্কডলিস্টে লিঙ্কডলিস্টনোডের একটি পয়েন্টার / রেফারেন্স হিসাবে একটি মান হিসাবে ব্যবহার করবে।

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

উপরের সমস্তগুলি কেবলমাত্র ন্যায়সঙ্গত যদি আপনি কিছু লুক আপ ভারী প্রক্রিয়াজাতকরণ করতে যাচ্ছেন। যদি আপনার কেবলমাত্র একবার ফ্রিকোয়েন্সি অনুসারে বাছাই করা দরকার হয় তবে আপনি কেবল (বেনামে) টিউপসগুলির একটি তালিকা তৈরি করতে পারেন:

var dict = new SortedDictionary<string, int>();
// ToDo: populate dict

var output = dict.OrderBy(e => e.Value).Select(e => new {frequency = e.Value, word = e.Key}).ToList();

foreach (var entry in output)
{
    Console.WriteLine("frequency:{0}, word: {1}",entry.frequency,entry.word);
}

15
Dictionary<string, string> dic= new Dictionary<string, string>();
var ordered = dic.OrderBy(x => x.Value);
return ordered.ToDictionary(t => t.Key, t => t.Value);

12

বা মজাদার জন্য আপনি কিছু লিনকিউ এক্সটেনশনের সদ্ব্যবহার ব্যবহার করতে পারেন:

var dictionary = new Dictionary<string, int> { { "c", 3 }, { "a", 1 }, { "b", 2 } };
dictionary.OrderBy(x => x.Value)
  .ForEach(x => Console.WriteLine("{0}={1}", x.Key,x.Value));

10

VB.NET ব্যবহার SortedDictionaryকরে একটি ListViewনিয়ন্ত্রণে আবদ্ধ করতে একটি তালিকা বাছাই করা :

Dim MyDictionary As SortedDictionary(Of String, MyDictionaryEntry)

MyDictionaryListView.ItemsSource = MyDictionary.Values.OrderByDescending(Function(entry) entry.MyValue)

Public Class MyDictionaryEntry ' Need Property for GridViewColumn DisplayMemberBinding
    Public Property MyString As String
    Public Property MyValue As Integer
End Class

XAML:

<ListView Name="MyDictionaryListView">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Path=MyString}" Header="MyStringColumnName"></GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding Path=MyValue}" Header="MyValueColumnName"></GridViewColumn>
         </GridView>
    </ListView.View>
</ListView>

7

বাছাই করা অভিধান পাওয়ার সহজতম উপায় হ'ল বিল্ট ইন SortedDictionaryক্লাস ব্যবহার করা :

//Sorts sections according to the key value stored on "sections" unsorted dictionary, which is passed as a constructor argument
System.Collections.Generic.SortedDictionary<int, string> sortedSections = null;
if (sections != null)
{
    sortedSections = new SortedDictionary<int, string>(sections);
}

sortedSections এর সাজানো সংস্করণ থাকবে version sections


7
আপনি যেমন আপনার মন্তব্যে উল্লেখ করেছেন, SortedDictionaryকী অনুসারে বাছাই করুন। ওপি মান অনুসারে বাছাই করতে চায়। SortedDictionaryএই ক্ষেত্রে সাহায্য করে না।
মার্টি নিল

ভাল ... যদি সে / সে (আপনি) পারেন তবে মানগুলি কী হিসাবে সেট করুন। আমি অপারেশনগুলির সময়সীমা নির্ধারণ করেছি এবং sorteddictionary()সর্বদা কমপক্ষে 1 মাইক্রোসেকেন্ড দ্বারা জিতেছি, এবং এটি পরিচালনা করা অনেক সহজ (কোনও অভিধানের সাথে সহজেই ইন্টারেক্ট করা এবং একইভাবে একটি অভিধানে পরিচালনা করা ওভারহেড হিসাবে 0 (এটি ইতিমধ্যে একটি sorteddictionary))।
mbrownnyc

2
@ এমব্রাউননিচ - না, এটি করার জন্য ভ্যালুগুলি অনন্য, এমন নিশ্চয়তা বা পূর্বশর্ত প্রয়োজন যা গ্যারান্টিযুক্ত নয়।
রজার উইলককস

6

অন্যান্য উত্তরগুলি ভাল, যদি আপনি চান তবে মানটির সাথে "অস্থায়ী" তালিকাটি বাছাই করা উচিত। যাইহোক, যদি আপনি একটি অভিধান অনুসারে সাজানো চাই Keyযে স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ অন্য অভিধান থাকে যার অনুসারে সাজানো হয় Value, আপনি ব্যবহার করতে পারে Bijection<K1, K2>বর্গ

Bijection<K1, K2> দুটি বিদ্যমান অভিধানের সাহায্যে আপনি সংগ্রহটি আরম্ভ করতে পারবেন, সুতরাং আপনি যদি তার মধ্যে একটির শৃঙ্খলাবদ্ধ না করতে চান এবং অন্যটিটিকে বাছাই করতে চান তবে আপনি কোডের মতো আপনার দ্বিধা তৈরি করতে পারেন

var dict = new Bijection<Key, Value>(new Dictionary<Key,Value>(), 
                               new SortedDictionary<Value,Key>());

আপনি dictযে কোনও সাধারণ অভিধানের মতো এটি ব্যবহার করতে পারেন (এটি প্রয়োগ করে IDictionary<K, V>) এবং তারপরে dict.Inverseসাজানো "বিপরীত" অভিধানটি পেতে কল করুন Value

Bijection<K1, K2>লইক.ক্লাকশনস.ডিএল এর অংশ , তবে আপনি যদি চান তবে আপনার সোর্স কোডটি কেবল নিজের প্রকল্পে অনুলিপি করতে পারবেন ।

দ্রষ্টব্য : যদি একই মান সহ একাধিক কী থাকে Bijectionতবে আপনি ব্যবহার করতে পারবেন না তবে আপনি কোনও সাধারণ Dictionary<Key,Value>এবং এ এর মধ্যে ম্যানুয়ালি সিঙ্ক্রোনাইজ করতে পারেন BMultiMap<Value,Key>


অনুরূপ http://stackoverflow.com/questions/268321 কিন্তু SortedDictionary সঙ্গে প্রতিটি অভিধান প্রতিস্থাপন করতে পারেন। যদিও উত্তরগুলি সদৃশ মানগুলিকে সমর্থন করে না বলে মনে হয় (ধরে নেওয়া হয় 1 থেকে 1)।
ক্রোকুসেক

3

ধরুন আমাদের কাছে একটি অভিধান রয়েছে have

   Dictionary<int, int> dict = new Dictionary<int, int>();
   dict.Add(21,1041);
   dict.Add(213, 1021);
   dict.Add(45, 1081);
   dict.Add(54, 1091);
   dict.Add(3425, 1061);
   sict.Add(768, 1011);

1) আপনি ব্যবহার করতে পারেন temporary dictionary to store values as:

        Dictionary<int, int> dctTemp = new Dictionary<int, int>();

        foreach (KeyValuePair<int, int> pair in dict.OrderBy(key => key.Value))
        {
            dctTemp .Add(pair.Key, pair.Value);
        }

3

প্রকৃতপক্ষে সি # তে ডিকোরিজ ডিন্টের বাছাই () পদ্ধতি রয়েছে, আপনি যেমন মানগুলি অনুসারে বাছাই করতে আগ্রহী, আপনি যতক্ষণ না কী প্রদান করেন ততক্ষণে আপনি মান পেতে পারবেন না, সংক্ষেপে, আপনাকে লিনিক্যু অর্ডার ব্যবহার করে সেগুলির মাধ্যমে পুনরাবৃত্তি করতে হবে,

var items = new Dictionary<string, int>();
items.Add("cat", 0);
items.Add("dog", 20);
items.Add("bear", 100);
items.Add("lion", 50);

// Call OrderBy method here on each item and provide them the ids.
foreach (var item in items.OrderBy(k => k.Key))
{
    Console.WriteLine(item);// items are in sorted order
}

আপনি একটি কৌশল করতে পারেন,

var sortedDictByOrder = items.OrderBy(v => v.Value);

অথবা

var sortedKeys = from pair in dictName
            orderby pair.Value ascending
            select pair;

এটি কী ধরণের মানগুলি আপনি সংরক্ষণ করছেন তার উপরও নির্ভর করে,
এটি কি একক (স্ট্রিং, ইনট) বা একাধিক (যেমন তালিকা, অ্যারে, ব্যবহারকারী সংজ্ঞায়িত শ্রেণি),
যদি একা থাকে তবে আপনি এর তালিকা তৈরি করতে পারেন তবে সাজান প্রয়োগ করুন।
যদি ব্যবহারকারী নির্ধারিত শ্রেণি থাকে, তবে সেই শ্রেণিকে অবশ্যই আইকনপ্রেবেবল বাস্তবায়ন করতে হবে
ClassName: IComparable<ClassName>এবং compareTo(ClassName c) তারা লিনকিউ থেকে আরও দ্রুত এবং আরও বেশি অবজেক্ট ওরিয়েন্টেড হিসাবে ওভাররাইড করতে হবে।


0

প্রয়োজনীয় নামস্থান: using System.Linq;

Dictionary<string, int> counts = new Dictionary<string, int>();
counts.Add("one", 1);
counts.Add("four", 4);
counts.Add("two", 2);
counts.Add("three", 3);

ডেস্ক দ্বারা অর্ডার:

foreach (KeyValuePair<string, int> kvp in counts.OrderByDescending(key => key.Value))
{
// some processing logic for each item if you want.
}

এসসি দ্বারা অর্ডার:

foreach (KeyValuePair<string, int> kvp in counts.OrderBy(key => key.Value))
{
// some processing logic for each item if you want.
}

-2

আপনি অভিধান অনুসারে মান অনুসারে বাছাই করতে পারেন এবং নীচের কোডটি ব্যবহার করে অভিধানে ফলাফল পেতে পারেন:

Dictionary <<string, string>> ShareUserNewCopy = 
       ShareUserCopy.OrderBy(x => x.Value).ToDictionary(pair => pair.Key,
                                                        pair => pair.Value);                                          

8
বাছাই করা আইটেমগুলিকে একটি অভিধানে ফিরে রেখে, আপনি যখন নতুন অভিধানটি গণনা করবেন তখন এগুলি বাছাই করার গ্যারান্টিযুক্ত হয় না।
মার্টি নিল

2
এবং এর উত্তর ইতিমধ্যে উত্তর দেওয়া হচ্ছে আপনি কেন এই উত্তর যুক্ত করছেন?
নওফাল

-2

আপনার কাছে একটি অভিধান রয়েছে তবে আপনি একটি লাইনারের নীচে ব্যবহার করে মানগুলিতে সরাসরি বাছাই করতে পারেন:

var x = (from c in dict orderby c.Value.Order ascending select c).ToDictionary(c => c.Key, c=>c.Value);

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