动态排序ObservableCollection 当列是字符串时

问题描述 投票:0回答:1

我有一个从SQL查询返回到WCF服务的大约5,000个对象的Observable Collection。我被要求按对象中的3个字段对集合进行排序。为简便起见,可以说这是我的C#模型:

public class TestObject{
     public string type1{get; set;}
     public string type2{get; set;}
     public string type3(get; set;}
}

这是一些我必须尝试排序的测试数据:

   public ObservableCollection<TestObject> TestObjects = new ObservableCollection<TestObject>();
   TestObjects.Add(new TestObject('708','4','(A)'));
   TestObjects.Add(new TestObject('7','41B','1(A)'));
   TestObjects.Add(new TestObject('69','2','45'));
   TestObjects.Add(new TestObject('708','4','(B)'));
   TestObjects.Add(new TestObject('69','2','5'));
   TestObjects.Add(new TestObject('7','41','1(B)'));
   TestObjects.Add(new TestObject('7','41',''));

是否有一种方法可以对这些元素进行动态排序,以便Observable集合可以像这样返回排序?

  {(7,41,''),(7,41,1(B)),(7,41B,1(A)),(69,2,5),(69,2,45),(708,4,(A)),(708,4,(B))}

到目前为止,我已经能够按类型1对它们进行排序,但是随后尝试按类型2对螺钉进行排序,从类型1进行排序。这是我尝试排序的方法,然后是我的称呼方法:

   protected virtual ObservableCollection<TestObject> SortTestObjects(ObservableCollection<TestObjects> unsortedObjects, string level){
        var SortedObjects = new ObservableCollection<TestObject>();
        Comparison<TestObject> numericComp;
        Comparison<TestObject> comparison;
        Comparison<TestObject> AlphaNumericComp;
        bool sortNumeric = false;
        switch (level)
        {
            case "type1":
                numericComp = (a, b) =>
                {
                    var aKey = Convert.ToDouble(a.type1);
                    var bKey = Convert.ToDouble(b.type1);
                    return aKey.CompareTo(bKey);
                };
                AlphaNumericComp = (a, b) =>
                {
                    return string.CompareOrdinal(a.type1, b.type1);
                };
                sortNumeric = unsortedObjects.ToList().TrueForAll(i => i.type1.IsNumeric());

                break;
            case "type2":
                 numericComp = (a, b) =>
                {
                    var aKey = Convert.ToDouble(a.type2);
                    var bKey = Convert.ToDouble(b.type2);
                    return aKey.CompareTo(bKey);
                };
                 AlphaNumericComp = (a, b) =>
                {
                    return string.CompareOrdinal(a.type2, b.type2);
                };
                sortNumeric = unsortedObjects.ToList().TrueForAll(i => i.type2.IsNumeric());

                break;
            case "type3":
                 numericComp = (a, b) =>
                {
                    var aKey = Convert.ToDouble(a.type3);
                    var bKey = Convert.ToDouble(b.type3);
                    return aKey.CompareTo(bKey);
                };
                 AlphaNumericComp = (a, b) =>
                {
                    return string.CompareOrdinal(a.type3, b.type3);
                };
                sortNumeric = unsortedObjects.ToList().TrueForAll(i => i.type3.IsNumeric());

                break;
            default:
                numericComp = (a, b) =>
                {
                    var aKey = Convert.ToDouble(a.type1);
                    var bKey = Convert.ToDouble(b.type1);
                    return aKey.CompareTo(bKey);
                };
                AlphaNumericComp = (a, b) =>
                {
                    return string.CompareOrdinal(a.type1, b.type1);
                };
                sortNumeric = unsortedObjects.ToList().TrueForAll(i => i.type1.IsNumeric());

                break;
        }
        comparison = sortNumeric ? numericComp : AlphaNumericComp;
        unsortedObjects.ToList().Sort(comparison);
        foreach(var obj in unsortedOjects){
          SortedObjects.Add(obj)
         }
        return SortedObjects;
     }

    Public ObservableCollection<TestObject> SortAllTestObjects(){
         var sort1 = SortTestObjects(TestObjects, "type1");
         var sort2 = SortTestObjects(sort1, "type2");
         var sort3 = SortTestObjects(sort2, "type3");
         return sort3;
    }

请让我知道是否需要更多信息。任何帮助或建设性的反馈都将很棒!

c# sorting oop observablecollection
1个回答
0
投票

您可以使用OrderBy()和ThenBy()。

示例

public class SomeClass
{
    public string PropA { get; }
    public string PropB { get; }
}

protected ObservableCollection<SomeClass> SomeFunc(ObservableCollection<SomeClass> collection)
{

    var sorted=collection.OrderBy(s => s.PropA).ThenBy(s => s.PropB);
    ObservableCollection<SomeClass> sortedObservable=new ObservableCollection<SomeClass>();
    foreach(var item in sorted)
    {
        sortedObservable.Add(item);
    }
    return sortedObservable;
}
© www.soinside.com 2019 - 2024. All rights reserved.