পর্যবেক্ষণযোগ্য বাছাই করা এবং একই জিনিস সাজানো ফেরত দেওয়া একটি এক্সটেনশন পদ্ধতি ব্যবহার করে করা যায়। বৃহত্তর সংগ্রহের জন্য সংগ্রহের পরিবর্তিত বিজ্ঞপ্তির সংখ্যার দিকে নজর রাখুন।
আমি পারফরম্যান্সের উন্নতির জন্য (নওফালকে ধন্যবাদ) এবং ডুপ্লিকেটগুলি পরিচালনা করতে আমার কোড আপডেট করেছি যা লেখার সময় এখানে অন্য কোনও উত্তর দেয় না। পর্যবেক্ষণযোগ্য একটি বাম সাজানো অর্ধেক এবং ডান অরসোর্ড অর্ধে বিভক্ত করা হয়, যেখানে প্রতিবার ন্যূনতম আইটেমটি (সাজানো তালিকায় পাওয়া যায়) সাজানো থেকে বাছাই করা পার্টিশনের শেষে স্থানান্তরিত হয়। সবচেয়ে খারাপ কেস ও (এন)। মূলত একটি বাছাই বাছাই (আউটপুট জন্য নীচে দেখুন)।
public static void Sort<T>(this ObservableCollection<T> collection)
where T : IComparable<T>, IEquatable<T>
{
List<T> sorted = collection.OrderBy(x => x).ToList();
int ptr = 0;
while (ptr < sorted.Count - 1)
{
if (!collection[ptr].Equals(sorted[ptr]))
{
int idx = search(collection, ptr+1, sorted[ptr]);
collection.Move(idx, ptr);
}
ptr++;
}
}
public static int search<T>(ObservableCollection<T> collection, int startIndex, T other)
{
for (int i = startIndex; i < collection.Count; i++)
{
if (other.Equals(collection[i]))
return i;
}
return -1;
}
ব্যবহার: একটি পর্যবেক্ষকের সাথে নমুনা (এটি সহজ রাখতে একজন ব্যক্তি শ্রেণি ব্যবহৃত হয়)
public class Person:IComparable<Person>,IEquatable<Person>
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(Person other)
{
if (this.Age == other.Age) return 0;
return this.Age.CompareTo(other.Age);
}
public override string ToString()
{
return Name + " aged " + Age;
}
public bool Equals(Person other)
{
if (this.Name.Equals(other.Name) && this.Age.Equals(other.Age)) return true;
return false;
}
}
static void Main(string[] args)
{
Console.WriteLine("adding items...");
var observable = new ObservableCollection<Person>()
{
new Person {Name = "Katy", Age = 51},
new Person {Name = "Jack", Age = 12},
new Person {Name = "Bob", Age = 13},
new Person {Name = "Alice", Age = 39},
new Person {Name = "John", Age = 14},
new Person {Name = "Mary", Age = 41},
new Person {Name = "Jane", Age = 20},
new Person {Name = "Jim", Age = 39},
new Person {Name = "Sue", Age = 5},
new Person {Name = "Kim", Age = 19}
};
observable.CollectionChanged += (sender, e) =>
{
Console.WriteLine(
e.OldItems[0] + " move from " + e.OldStartingIndex + " to " + e.NewStartingIndex);
int i = 0;
foreach (var person in sender as ObservableCollection<Person>)
{
if (i == e.NewStartingIndex)
{
Console.Write("(" + (person as Person).Age + "),");
}
else
{
Console.Write((person as Person).Age + ",");
}
i++;
}
Console.WriteLine();
};
সংগ্রহটি কীভাবে করা হয় তা দেখিয়ে অগ্রগতি বাছাইয়ের বিশদ:
Sue aged 5 move from 8 to 0
(5),51,12,13,39,14,41,20,39,19,
Jack aged 12 move from 2 to 1
5,(12),51,13,39,14,41,20,39,19,
Bob aged 13 move from 3 to 2
5,12,(13),51,39,14,41,20,39,19,
John aged 14 move from 5 to 3
5,12,13,(14),51,39,41,20,39,19,
Kim aged 19 move from 9 to 4
5,12,13,14,(19),51,39,41,20,39,
Jane aged 20 move from 8 to 5
5,12,13,14,19,(20),51,39,41,39,
Alice aged 39 move from 7 to 6
5,12,13,14,19,20,(39),51,41,39,
Jim aged 39 move from 9 to 7
5,12,13,14,19,20,39,(39),51,41,
Mary aged 41 move from 9 to 8
5,12,13,14,19,20,39,39,(41),51,
ব্যক্তি শ্রেণি আইকোপ্যামেবল এবং আইক্যায়েটেবল উভয়ই প্রয়োগ করে তবে পরবর্তীটি সংগ্রহের পরিবর্তনগুলি হ্রাস করতে ব্যবহৃত হয় যাতে উত্থাপিত পরিবর্তনের বিজ্ঞপ্তিগুলির সংখ্যা হ্রাস করতে পারে
- একটি নতুন অনুলিপি তৈরি না করেই সম্পাদনা একই সংগ্রহের বাছাই করে *
একটি পর্যবেক্ষণযোগ্য সংগ্রহ ফিরিয়ে আনার জন্য, কল করুন। টোগো অবজার্ভেবল কালেকশন * সর্ডটোক * এ যেমন [এই বাস্তবায়ন] [1] ব্যবহার করে।
**** মূল উত্তর - এটি একটি নতুন সংগ্রহ তৈরি করে **** আপনি নীচের ডোসর্ট পদ্ধতি হিসাবে লিঙ্ক ব্যবহার করতে পারেন illust একটি দ্রুত কোড স্নিপেট: উত্পাদন করে
3: এক্সে 6: এফটি 7: আআ
বিকল্পভাবে আপনি সংগ্রহটিতে নিজেই একটি এক্সটেনশন পদ্ধতি ব্যবহার করতে পারেন
var sortedOC = _collection.OrderBy(i => i.Key);
private void doSort()
{
ObservableCollection<Pair<ushort, string>> _collection =
new ObservableCollection<Pair<ushort, string>>();
_collection.Add(new Pair<ushort,string>(7,"aaa"));
_collection.Add(new Pair<ushort, string>(3, "xey"));
_collection.Add(new Pair<ushort, string>(6, "fty"));
var sortedOC = from item in _collection
orderby item.Key
select item;
foreach (var i in sortedOC)
{
Debug.WriteLine(i);
}
}
public class Pair<TKey, TValue>
{
private TKey _key;
public TKey Key
{
get { return _key; }
set { _key = value; }
}
private TValue _value;
public TValue Value
{
get { return _value; }
set { _value = value; }
}
public Pair(TKey key, TValue value)
{
_key = key;
_value = value;
}
public override string ToString()
{
return this.Key + ":" + this.Value;
}
}