繁体   English   中英

按字符串对ObservableCollection进行排序

[英]Sorting ObservableCollection by String

我有一个Observable集合,该集合的一个项目有一个标记(字符串)和一个isChecked(布尔值)。

用户可以选择一个标签来对列表进行排序,例如“事件”和/或设置IsChecked。

订购优先级应按以下方式工作:1)isChecked == true 2)标签等于商品标签3)其余商品按标签字母顺序排列

我通过xaml在ListBox中显示ObservableCollection。 知道如何实现吗?

EDIT: providing example for clarification:
item0: tag = "apple", isChecked = false;
item1: tag = "apple", isChecked = true;
item2: tag = "pineapple", isChecked = false;
item3: tag = "coconut", isChecked = true;
item4: tag = "cherry", isChecked = false;

string is: "cherry"
outcome: item1, item3, item4, item0, item2

为了能够检索您的条件,我做了以下工作。

 // Retrieve an IQueryable for the colleciton with your specified conditions
 var query = from c in collection
             orderby c.IsChecked descending, c.Tag.Equals("cherry") descending, c.obsTag
             select c;

 // Clear the collection
 collection = new ObservableCollection<myCollectionObject>();
 // Replace the collection with your IQueryable results
 foreach(myCollectionObject obj in query) {
      collection.Add(obj);
 }

如果您想一排全部:

 collection = new ObservableCollection<obsCol>(from c in collection 
              orderby c.obsCheck descending, c.obsTag.Equals("cherry") descending, c.obsTag 
 select c);

要与UI的实现以及模型的实现分离,您必须使用CollectionViewSource

可通过以下自定义Comprarer对对象列表进行排序的具体示例:

WPF:ListCollectionView用于排序,筛选和分组

#2有点棘手。

为此,您可能需要在代码后面添加另一个Public Enumerable,以两个步骤构建代码。

OP,请先弄清楚#2是什么,然后再沿着这条路走。

2标签等于标签

3按标签字母顺序

完全不清楚。 三参考标签。

根据您的评论需求,将清单分为两部分
问题陈述不反映评论。
您不能指望人们阅读评论。

IsChecked = True和Tag ='match'

然后追加

IsChecked = false或Tag!=按标签“匹配”顺序

抱歉,我现在没有时间使用LINQ,老实说,您还没有在出色的问题陈述上付出很多努力。

动态排序 ObservableCollection<object> 当列是字符串时<div id="text_translate"><p>我有大约 5,000 个对象的 Observable 集合,这些对象从 SQL 查询返回到我的 WCF 服务。 我被要求按 object 中的 3 个字段对集合进行排序。 为简洁起见,假设这是我的 c# model:</p><pre> public class TestObject{ public string type1{get; set;} public string type2{get; set;} public string type3(get; set;} }</pre><p> 这是我必须尝试排序的一些测试数据:</p><pre> public ObservableCollection&lt;TestObject&gt; TestObjects = new ObservableCollection&lt;TestObject&gt;(); 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',''));</pre><p> 有没有办法对这些进行动态排序,所以 Observable 集合会像这样排序?</p><pre> {(7,41,''),(7,41,1(B)),(7,41B,1(A)),(69,2,5),(69,2,45),(708,4,(A)),(708,4,(B))}</pre><p> 到目前为止,我已经能够按 type1 对它们进行排序,但随后尝试按 type2 排序,将 type1 排序的顺序提高了。 这是我用来尝试排序的方法,然后是我如何称呼它:</p><pre> protected virtual ObservableCollection&lt;TestObject&gt; SortTestObjects(ObservableCollection&lt;TestObjects&gt; unsortedObjects, string level){ var SortedObjects = new ObservableCollection&lt;TestObject&gt;(); Comparison&lt;TestObject&gt; numericComp; Comparison&lt;TestObject&gt; comparison; Comparison&lt;TestObject&gt; AlphaNumericComp; bool sortNumeric = false; switch (level) { case "type1": numericComp = (a, b) =&gt; { var aKey = Convert.ToDouble(a.type1); var bKey = Convert.ToDouble(b.type1); return aKey.CompareTo(bKey); }; AlphaNumericComp = (a, b) =&gt; { return string.CompareOrdinal(a.type1, b.type1); }; sortNumeric = unsortedObjects.ToList().TrueForAll(i =&gt; i.type1.IsNumeric()); break; case "type2": numericComp = (a, b) =&gt; { var aKey = Convert.ToDouble(a.type2); var bKey = Convert.ToDouble(b.type2); return aKey.CompareTo(bKey); }; AlphaNumericComp = (a, b) =&gt; { return string.CompareOrdinal(a.type2, b.type2); }; sortNumeric = unsortedObjects.ToList().TrueForAll(i =&gt; i.type2.IsNumeric()); break; case "type3": numericComp = (a, b) =&gt; { var aKey = Convert.ToDouble(a.type3); var bKey = Convert.ToDouble(b.type3); return aKey.CompareTo(bKey); }; AlphaNumericComp = (a, b) =&gt; { return string.CompareOrdinal(a.type3, b.type3); }; sortNumeric = unsortedObjects.ToList().TrueForAll(i =&gt; i.type3.IsNumeric()); break; default: numericComp = (a, b) =&gt; { var aKey = Convert.ToDouble(a.type1); var bKey = Convert.ToDouble(b.type1); return aKey.CompareTo(bKey); }; AlphaNumericComp = (a, b) =&gt; { return string.CompareOrdinal(a.type1, b.type1); }; sortNumeric = unsortedObjects.ToList().TrueForAll(i =&gt; i.type1.IsNumeric()); break; } comparison = sortNumeric? numericComp: AlphaNumericComp; unsortedObjects.ToList().Sort(comparison); foreach(var obj in unsortedOjects){ SortedObjects.Add(obj) } return SortedObjects; } Public ObservableCollection&lt;TestObject&gt; SortAllTestObjects(){ var sort1 = SortTestObjects(TestObjects, "type1"); var sort2 = SortTestObjects(sort1, "type2"); var sort3 = SortTestObjects(sort2, "type3"); return sort3; }</pre><p> **编辑:这是我将在此示例中使用的 SQL 查询。 只要我在客户端获得正确的订单,我就可以完全更改查询**</p><pre> Select type1, type2, type3 from dbo.testObject tO where tO.del_date is null</pre><p> 如果您需要更多信息,请告诉我。 任何帮助或建设性的反馈都会很棒!</p></div></object>

[英]Dynamically sorting an ObservableCollection<object> when the column is a string

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 动态排序 ObservableCollection<object> 当列是字符串时<div id="text_translate"><p>我有大约 5,000 个对象的 Observable 集合,这些对象从 SQL 查询返回到我的 WCF 服务。 我被要求按 object 中的 3 个字段对集合进行排序。 为简洁起见,假设这是我的 c# model:</p><pre> public class TestObject{ public string type1{get; set;} public string type2{get; set;} public string type3(get; set;} }</pre><p> 这是我必须尝试排序的一些测试数据:</p><pre> public ObservableCollection&lt;TestObject&gt; TestObjects = new ObservableCollection&lt;TestObject&gt;(); 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',''));</pre><p> 有没有办法对这些进行动态排序,所以 Observable 集合会像这样排序?</p><pre> {(7,41,''),(7,41,1(B)),(7,41B,1(A)),(69,2,5),(69,2,45),(708,4,(A)),(708,4,(B))}</pre><p> 到目前为止,我已经能够按 type1 对它们进行排序,但随后尝试按 type2 排序,将 type1 排序的顺序提高了。 这是我用来尝试排序的方法,然后是我如何称呼它:</p><pre> protected virtual ObservableCollection&lt;TestObject&gt; SortTestObjects(ObservableCollection&lt;TestObjects&gt; unsortedObjects, string level){ var SortedObjects = new ObservableCollection&lt;TestObject&gt;(); Comparison&lt;TestObject&gt; numericComp; Comparison&lt;TestObject&gt; comparison; Comparison&lt;TestObject&gt; AlphaNumericComp; bool sortNumeric = false; switch (level) { case "type1": numericComp = (a, b) =&gt; { var aKey = Convert.ToDouble(a.type1); var bKey = Convert.ToDouble(b.type1); return aKey.CompareTo(bKey); }; AlphaNumericComp = (a, b) =&gt; { return string.CompareOrdinal(a.type1, b.type1); }; sortNumeric = unsortedObjects.ToList().TrueForAll(i =&gt; i.type1.IsNumeric()); break; case "type2": numericComp = (a, b) =&gt; { var aKey = Convert.ToDouble(a.type2); var bKey = Convert.ToDouble(b.type2); return aKey.CompareTo(bKey); }; AlphaNumericComp = (a, b) =&gt; { return string.CompareOrdinal(a.type2, b.type2); }; sortNumeric = unsortedObjects.ToList().TrueForAll(i =&gt; i.type2.IsNumeric()); break; case "type3": numericComp = (a, b) =&gt; { var aKey = Convert.ToDouble(a.type3); var bKey = Convert.ToDouble(b.type3); return aKey.CompareTo(bKey); }; AlphaNumericComp = (a, b) =&gt; { return string.CompareOrdinal(a.type3, b.type3); }; sortNumeric = unsortedObjects.ToList().TrueForAll(i =&gt; i.type3.IsNumeric()); break; default: numericComp = (a, b) =&gt; { var aKey = Convert.ToDouble(a.type1); var bKey = Convert.ToDouble(b.type1); return aKey.CompareTo(bKey); }; AlphaNumericComp = (a, b) =&gt; { return string.CompareOrdinal(a.type1, b.type1); }; sortNumeric = unsortedObjects.ToList().TrueForAll(i =&gt; i.type1.IsNumeric()); break; } comparison = sortNumeric? numericComp: AlphaNumericComp; unsortedObjects.ToList().Sort(comparison); foreach(var obj in unsortedOjects){ SortedObjects.Add(obj) } return SortedObjects; } Public ObservableCollection&lt;TestObject&gt; SortAllTestObjects(){ var sort1 = SortTestObjects(TestObjects, "type1"); var sort2 = SortTestObjects(sort1, "type2"); var sort3 = SortTestObjects(sort2, "type3"); return sort3; }</pre><p> **编辑:这是我将在此示例中使用的 SQL 查询。 只要我在客户端获得正确的订单,我就可以完全更改查询**</p><pre> Select type1, type2, type3 from dbo.testObject tO where tO.del_date is null</pre><p> 如果您需要更多信息,请告诉我。 任何帮助或建设性的反馈都会很棒!</p></div></object> ObservableCollection不排序 UWP ObservableCollection排序和分组 按日期排序ObservableCollection WP7 ObservableCollection排序 对ObservableCollection排序时发生InvalidOperationException 手动排序ObservableCollection &lt;&gt; 转换ObservableCollection <T> 到ObservableCollection <String> 排序ObservableCollection <Class> 列表框中的数据 对ObservableCollection(Reactive Extensions)的值进行排序
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM