更改 ObservableCollection<T> 的处理顺序 (c#)
Chaning processing sequence of ObservableCollection<T> (c#)
有没有一种简单的方法可以影响 C# 中 ObservableCollection 的处理顺序?
假设我有以下 class:
public class GeneratorObject : IComparable
{
int processingSequence {get; set;}
string property1 {get; set;}
Boolean property2 {get; set;}
public GeneratorObject(int processingSequence)
{
this.processingSequence = processingSequence;
}
public int CompareTo(object obj)
{
// Implementation
}
}
处理顺序可以是每个自然数。
我想重复其中的一些
ObservableCollection<GeneratorObject> toIterate = new ObservableCollection<GeneratorObject>();
toIterate.Add(new GeneratorObject(99));
toIterate.Add(new GeneratorObject(1));
toIterate.Add(new GeneratorObject(10));
toIterate.Add(new GeneratorObject(6));
foreach (GeneratorObject field in toIterate)
{
// Manipulating the properties of field
}
我真的不想对集合进行排序,尤其是在视图中。我只想更改迭代顺序。首先是序列号最低的元素,...,
此外,重要的是要说,我在迭代时操纵项目,不能只使用集合的副本。
我已经实现了 IComparable,我想我可以简单地说,例如Collection.Sort() 而不会破坏与 UI.
的绑定
感谢您的帮助。
您可以创建一个 copy
列表,对其进行排序,然后迭代 copy
列表:
//ObservableCollection<GeneratorObject> toIterate;
// I am assuming that 'toIterate' is not null and bound to the UI
toIterate.Add(new GeneratorObject(99));
toIterate.Add(new GeneratorObject(1));
toIterate.Add(new GeneratorObject(10));
toIterate.Add(new GeneratorObject(6));
var copy = toIterate.ToList();
copy.Sort();
foreach (GeneratorObject field in copy)
{
}
此处的排序操作是在不同的列表上执行的,因此不会更改 UI 中的顺序。
如果列表在迭代时发生变化,那么您可以循环直到列表为空,然后在每次迭代中找到最小值,而不是迭代。
while (toIterate.Any())
{
GeneratorObject generatorObject = toIterate.Min();
// do something with it
}
感谢您对副本的提示。我不知道这是否是一个好的答案(尤其是关于性能),但我通过以下方式解决了这个问题。
var copy = toIterate.ToList();
copy.Sort();
// iterate through the sorted List
foreach (GeneratorObject field in copy)
{
// get the original object regarding to this sorted item
GeneratorObject originalObjectForAction = getGeneratorObject(toIterate, field);
// do stuff with the original item
}
public GeneratorObject getGeneratorObject(ObservableCollection<GeneratorObject> list, GeneratorObject objekt)
{
foreach (DwhRoboterGeneratorObjekt field in list)
{
if (field == objekt) return field;
}
throw new Exception("Not found");
}
有没有一种简单的方法可以影响 C# 中 ObservableCollection 的处理顺序?
假设我有以下 class:
public class GeneratorObject : IComparable
{
int processingSequence {get; set;}
string property1 {get; set;}
Boolean property2 {get; set;}
public GeneratorObject(int processingSequence)
{
this.processingSequence = processingSequence;
}
public int CompareTo(object obj)
{
// Implementation
}
}
处理顺序可以是每个自然数。
我想重复其中的一些
ObservableCollection<GeneratorObject> toIterate = new ObservableCollection<GeneratorObject>();
toIterate.Add(new GeneratorObject(99));
toIterate.Add(new GeneratorObject(1));
toIterate.Add(new GeneratorObject(10));
toIterate.Add(new GeneratorObject(6));
foreach (GeneratorObject field in toIterate)
{
// Manipulating the properties of field
}
我真的不想对集合进行排序,尤其是在视图中。我只想更改迭代顺序。首先是序列号最低的元素,..., 此外,重要的是要说,我在迭代时操纵项目,不能只使用集合的副本。
我已经实现了 IComparable,我想我可以简单地说,例如Collection.Sort() 而不会破坏与 UI.
的绑定感谢您的帮助。
您可以创建一个 copy
列表,对其进行排序,然后迭代 copy
列表:
//ObservableCollection<GeneratorObject> toIterate;
// I am assuming that 'toIterate' is not null and bound to the UI
toIterate.Add(new GeneratorObject(99));
toIterate.Add(new GeneratorObject(1));
toIterate.Add(new GeneratorObject(10));
toIterate.Add(new GeneratorObject(6));
var copy = toIterate.ToList();
copy.Sort();
foreach (GeneratorObject field in copy)
{
}
此处的排序操作是在不同的列表上执行的,因此不会更改 UI 中的顺序。
如果列表在迭代时发生变化,那么您可以循环直到列表为空,然后在每次迭代中找到最小值,而不是迭代。
while (toIterate.Any())
{
GeneratorObject generatorObject = toIterate.Min();
// do something with it
}
感谢您对副本的提示。我不知道这是否是一个好的答案(尤其是关于性能),但我通过以下方式解决了这个问题。
var copy = toIterate.ToList();
copy.Sort();
// iterate through the sorted List
foreach (GeneratorObject field in copy)
{
// get the original object regarding to this sorted item
GeneratorObject originalObjectForAction = getGeneratorObject(toIterate, field);
// do stuff with the original item
}
public GeneratorObject getGeneratorObject(ObservableCollection<GeneratorObject> list, GeneratorObject objekt)
{
foreach (DwhRoboterGeneratorObjekt field in list)
{
if (field == objekt) return field;
}
throw new Exception("Not found");
}