C# 如何对可观察集合进行排序<;KeyValuePair<;int,string>;

C# 如何对可观察集合进行排序<;KeyValuePair<;int,string>;,c#,.net,wpf,sorting,observablecollection,C#,.net,Wpf,Sorting,Observablecollection,我在一个文本框中绑定了一个名为TestList的ObservableCollection(),我想按int对集合进行排序。我尝试了以下操作,但未对集合进行排序: new ObservableCollection<KeyValuePair<int, string>>( TestList .Where(p => p.Key > 0) .GroupBy(p => p.Key)

我在一个文本框中绑定了一个名为TestList的
ObservableCollection()
,我想按
int
对集合进行排序。我尝试了以下操作,但未对集合进行排序:

new ObservableCollection<KeyValuePair<int, string>>(
                 TestList .Where(p => p.Key > 0)
                 .GroupBy(p => p.Key)
                 .Select(grp => grp.First())
                 .OrderBy(p => p.Key)
                 );
新的ObservableCollection(
TestList.Where(p=>p.Key>0)
.GroupBy(p=>p.Key)
.Select(grp=>grp.First())
.OrderBy(p=>p.Key)
);
如何对收藏进行排序?那么这种装订方式还能用吗

编辑(也不起作用):

公共ObservableCollection测试列表
{
获取{return testList;}
设置{
testList=值;
NotifyPropertyChanged(“测试列表”);
}
}
公共无效测试(int索引)
{
TestList.RemoveAt(索引);
TestList=newobserveCollection(TestList.OrderBy(p=>p.Key));
}
和图形用户界面:

<TextBox Grid.Column="0" IsReadOnly="True"
Text="{Binding Path=Value , Mode=OneWay}" />

您不必按分组。你只需要一个简单的订单

TestList.OrderBy(p => p.Key)

你不必按顺序分组。你只需要一个简单的订单

TestList.OrderBy(p => p.Key)

由于源代码包含
KeyValuePair
对象,因此您可能会假定这些密钥已被重复消除。因此,分组没有任何用处。只要按和您的位置保存订单,您就可以了

new ObservableCollection<KeyValuePair<int, string>>(
             TestList.Where(p => p.Key > 0)
             .OrderBy(p => p.Key)
             );
新的ObservableCollection(
TestList.Where(p=>p.Key>0)
.OrderBy(p=>p.Key)
);

由于源代码包含
KeyValuePair
对象,因此您可能会假设密钥已被重复删除。因此,分组没有任何用处。只要按和您的位置保存订单,您就可以了

new ObservableCollection<KeyValuePair<int, string>>(
             TestList.Where(p => p.Key > 0)
             .OrderBy(p => p.Key)
             );
新的ObservableCollection(
TestList.Where(p=>p.Key>0)
.OrderBy(p=>p.Key)
);

查询将返回按键排序的第一个组,您希望它做什么?
TestList.RemoveAt(index)
将调用getter而不是setter,因此不会调用
NotifyPropertyChanged(“TestList”)
。如果要在集合更改时通知,请将某些内容连接到CollectionChanged事件<代码>TestList.OrderBy(p=>p.Key)返回一个新的排序的
IEnuemrable
,您将丢弃它,但它不会在适当的位置改变列表。您需要做一些类似于
TestList=newobservetecollection(TestList.OrderBy(p=>p.Key))TestList.RemoveAt(index)
将调用getter而不是setter,因此不会调用
NotifyPropertyChanged(“TestList”)
。如果要在集合更改时通知,请将某些内容连接到CollectionChanged事件<代码>TestList.OrderBy(p=>p.Key)
返回一个新的排序的
IEnuemrable
,您将丢弃它,但它不会在适当的位置改变列表。您需要做一些类似于
TestList=newobservetecollection(TestList.OrderBy(p=>p.Key))TestList=newobserveCollection(TestList.OrderBy(p=>p.Key))是的,我试过了,并在行后设置了一个断点,但是键(索引)的顺序错误。如果我删除第二项(索引1),我会得到集合键(0,2,3,4),但我需要0,1,2,3@Stampy这听起来很正常,如果你有0,1,2,3,4,删除了索引1,剩下的是0,2,3,4。如果您刚刚删除了新列表,您如何期望它包含1。对列表排序不会对键重新编号。@BenRobinson我希望其他项的索引减少1。也许我的问题不清楚。编辑:好的,我肯定,我的问题是错的。我想重新编号我的钥匙。抱歉,我将接受回答我在你的行之后设置了一个断点,我的集合没有排序,属性测试列表没有启动。我已经更新了一些问题code@StampyChristos的意思是:
TestList=newobserveCollection(TestList.OrderBy(p=>p.Key))是的,我试过了,并在行后设置了一个断点,但是键(索引)的顺序错误。如果我删除第二项(索引1),我会得到集合键(0,2,3,4),但我需要0,1,2,3@Stampy这听起来很正常,如果你有0,1,2,3,4,删除了索引1,剩下的是0,2,3,4。如果您刚刚删除了新列表,您如何期望它包含1。对列表排序不会对键重新编号。@BenRobinson我希望其他项的索引减少1。也许我的问题不清楚。编辑:好的,我肯定,我的问题是错的。我想重新编号我的钥匙。对不起,我会接受答案的