2014-02-07 32 views
0

如何实现字符串大小写不敏感排序唯一ObservableCollection?如何实现字符串不区分大小写排序唯一ObservableCollection

对于数据输入,用户可以为他们使用的字符串值创建贴纸。
该列表需要区分大小写且唯一并排序。

没有在SO上找到解决方案并实施了一个。
这可能对某人有价值。
而且可能会得到更好的答案。

回答

0

这就是我想出了

using System.Collections.ObjectModel; 
namespace OCstringUnique2 
{ 
    public partial class MainWindow : Window 
    { 
     private OCstringUniqueSorted myCol = new OCstringUniqueSorted(); 
     public MainWindow() 
     { 
      myCol.Add("bb"); 
      myCol.Add("aa"); 
      myCol.Add("zz"); 
      this.DataContext = this; 
      InitializeComponent(); 
     } 
     public OCstringUniqueSorted MyCol { get { return myCol; } } 
     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      string s = tbNew.Text; 
      MyCol.Add(s); 
     } 
    } 
    public class OCstringUniqueSorted : ObservableCollection<string> 
    { 
     public new void Add(string item) 
     { 
      if (item == null) return; 
      item = item.Trim(); 
      if (String.IsNullOrEmpty(item)) return; 
      if (this.Contains(item)) return; 
      if (this.Contains(item, StringComparer.CurrentCultureIgnoreCase)) return; 
      base.Add(item); 
     } 
     protected override void InsertItem(int index, string item) 
     { 
      int i = 0; 
      foreach(string s in this) 
      { 
       if(string.Compare(s,item,true) >= 0) 
       { 
        base.InsertItem(i, item); 
        return; 
       } 
       i++; 
      } 
      base.InsertItem(i, item); 
     } 
    } 
} 

<Grid> 
    <StackPanel Orientation="Vertical"> 
     <TextBox Width="100" HorizontalAlignment="Left" x:Name="tbNew" /> 
     <Button Content="Add" Click="Button_Click" Width="40" HorizontalAlignment="Left"/> 
     <ListBox ItemsSource="{Binding Path=MyCol}"/> 
    </StackPanel> 
</Grid> 
1

我不认为你应该排序您ObservableCollection可言,这是不是它的目的是做反正...

在我认为你应该有你的ObservableCollection的顶部,你的UI将用于绑定,并且可以非常容易地通过增加SortDescription s为单位排序的CollectionViewSource ...

private ICollectionView myCollectionView; 
public ICollectionView MyCollectionView... 

MyCollectionView.SortDescriptions.Add(new SortDescription(propertyName, 
    MyListSortDir)); 

这样你不必修改你的Collection,而是在它的顶部使用一个抽象层,你可以绑定到一个层,而不是绑定到实际的集合,并且你可以随心所欲地做任何事情(包括任何类型的排序),而不会影响潜在的收藏...

+0

但是,这是一个集合,我只想使用独特和排序。为什么要分类每个回报CollectionViewSource可以执行唯一的吗? – Paparazzi

+0

是的,你可以使用过滤器事件排除非独特的项目,我不认为它是在每次返回时排序,只是添加新项目... –

+0

好的,但我不想排除非唯一来自演示的项目。我不想让非独特的时刻进入榜单。 – Paparazzi

相关问题