C#SortedObservableCollection by object的object属性

时间:2016-04-29 18:52:40

标签: c# wpf sorting

也许这已经得到了解答,但我无法在Google上找到答案。如果我一直在道歉。我有一个SortedObservableCollection<TargetViewModel>,我试图根据TargetViewModel上的字符串属性从A-Z按字母顺序排列。我在CompareTo上实施了TargetViewModel,问题是有一个特殊的常量标签,其字符串属性只是我们用作添加方式的+符号一个新标签。这需要位于所有选项卡的右侧,并且在+符号之前以及应始终位于最左侧位置的常量选项卡之后添加任何新选项卡。有没有办法指定选项卡,在左边和右边一个,并在两个之间订购所有选项卡?即| MainTab |标签A |标签B |标签C | + |

这是CompareTo函数的样子:

public int CompareTo(object obj)
{
    if (obj == null)
        return 1;
    TargetViewModel tvm = obj as TargetViewModel;
    if (tvm != null)
    {
        return string.Compare(tvm.Header, Header, StringComparison.CurrentCultureIgnoreCase);
    }

    throw new ArgumentException("Object is not a TargetViewModel");
}

1 个答案:

答案 0 :(得分:2)

以下显示如何构建一个基于字符串执行所需操作的比较器。它应该很容易适用于您的情况:

    static void Main(string[] args)
    {
        List<string> items = new List<string> {"+", "A", "B", "V", "MainTab"};
        items.Sort(new CustomComparer());
        items.ForEach(Console.WriteLine);
    }

    class CustomComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            if (ReferenceEquals(x, y)) return 0;
            if (x == null) return -1;
            if (y == null) return 1;
            if (x.Equals(y, StringComparison.Ordinal)) return 0;

            if (x.Equals("MainTab", StringComparison.Ordinal)) return -1;
            if (y.Equals("MainTab", StringComparison.Ordinal)) return 1;

            if (x.Equals("+", StringComparison.Ordinal)) return 1;
            if (y.Equals("+", StringComparison.Ordinal)) return -1;

            return string.CompareOrdinal(x, y);
        }
    }