当列是字符串时,对ObservableCollection <object>进行动态排序

我有一个从SQL查询返回到WCF服务的大约5,000个对象的可观察集合。我被要求按对象中的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','(B)'));
   TestObjects.Add(new TestObject('69','5'));
   TestObjects.Add(new TestObject('7','41','1(B)'));
   TestObjects.Add(new TestObject('7',''));

有没有一种方法可以对它们进行动态排序,以便Observable集合可以像这样进行排序?

  {(7,41,''),(7,1(B)),41B,1(A)),(69,2,5),45),(708,4,(A)),(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.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;
    }

**编辑:这是在此示例中使用的SQL查询。只要我在客户端中获得正确的订单,我就完全可以更改查询**

Select type1,type2,type3 from dbo.testObject tO where tO.del_date is null

如果您需要更多信息,请告诉我。任何帮助或建设性的反馈都将很棒!

z332150607 回答:当列是字符串时,对ObservableCollection <object>进行动态排序

所以这就是我最终要解决的问题。在对象中,我串联了类型

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

以及在填充TestObjects的方法中,我在以下位置添加了它:

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

接下来,我使用“ Shlwapi.dll”在ViewModel中创建了一个自定义比较方法:

   [DllImport("Shlwapi.dll",Charset = Charset.Unicode)]
   private static extern int StrCmpLogicalW(string x,string y); 

   public ObservableCollection<TestObject> SortObjects(ObservableCollection<TestObject> unsortedObjects){
   var sortedCollection = new ObservableCollection<TestObject>();
   var objectList = new List<TestObject>();
   foreach(var obj in unsortedObjects){
      objectList.Add(obj);
     }
   Comparison<TestObject> typesComp = (a,b) =>{
      var aKey = a.types;
      var bKey = b.types;
      return StrCmpLogicalW(aKey,bKey);
   }
   objectList.Sort(typesComp);
   foreach(var obj in objectList){
     sortedCollection.Add(obj);
   }
   return sortedCollection;
   }

此方法允许我以升序返回TestObjects集合。仍在进行降序切换,并且在我得到它时将对其进行更新。

更新:这是具有反转功能的SortObjects方法

   public ObservableCollection<TestObject> SortObjects(ObservableCollection<TestObject> unsortedObjects,bool IsAscend){
      var sortedCollection = new ObservableCollection<TestObject>();
      var objectList = new List<TestObject>();
      foreach(var obj in unsortedObjects){
         objectList.Add(obj);
      }
      Comparison<TestObject> typesComp = (a,b) =>{
         var aKey = a.types;
         var bKey = b.types;
         return StrCmpLogicalW(aKey,bKey);
      }
      objectList.Sort(typesComp);
      if(!isAscend){
         objectsList.Reverse();
      }
      foreach(var obj in objectList){
        sortedCollection.Add(obj);
      }
      return sortedCollection;
    } 

然后调用它来传递像这样的true / false参数以升序:

 TestObjects = SortObjects(TestObjects,true);

,按降序排列:

 TestObjects = SortObjects(TestObjects,false);
,

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

示例

namedtuples

要考虑字符串中的数字值,可以使用自定义比较器hard to exactly define

The answer to this is a good example

本文链接:https://www.f2er.com/3063649.html

大家都在问