ObningableCollection的转换处理顺序<t>(c#)

时间:2017-03-20 06:35:02

标签: c# sorting observablecollection icomparable

是否有一种简单的方法可以影响c#中的ObservableCollection的处理顺序?

假设我有以下课程:

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
}

我真的不想在视图中特别对Collection进行排序。我只是想改变迭代的顺序。首先是序列号最小的元素,..., 进一步说,重要的是,我在迭代时操纵项目,不能只使用集合的副本。

我已经实现了IComparable并认为我可以很容易地说Collection.Sort()而不破坏与UI的绑定。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

您可以创建列表的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中的顺序。

答案 1 :(得分:0)

如果列表在迭代时正在改变,那么您可以循环直到列表为空,并在每次迭代时找到min。

while (toIterate.Any())
{
    GeneratorObject generatorObject = toIterate.Min();
    // do something with it
}

答案 2 :(得分:0)

感谢您提供副本的提示。我不知道这是否是一个很好的答案(特别是关于表演),但我通过以下方式解决了这个问题。

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");
}