簡體   English   中英

改變C#排序行為

[英]Change C# sorting behaviour

讓我們說我有字符串abc_abc2_ 現在,通常排序時I C# abc2_要跟從abc_ ,留下的結果:

  1. abc_
  2. abc2_

如果重要的話,我用這個來排序:

     var element = from c in elements
     orderby c.elementName ascending
     select c;

我怎么能改變這個? 我希望abc_能夠到最后。 反轉不是一個選項,因為列表包含兩個以上的元素。

OrderBy方法可以采用IComparer<T>參數。 (我不確定該重載是否可以與查詢理解語法一起使用,或者它是否僅在使用fluent擴展方法語法時可用。)

由於不清楚你的排序算法究竟應該涉及什么,我將繼續實現所需的IComparer<T>作為讀者的練習。

最簡單的解決方案是使用.NET Framework內置的序數字符串比較器:

var element = from c in elements
    .OrderBy(c => c.elementName, StringComparer.Ordinal) 
    select c; 

無需自定義Comparer類!

如果你想強調不參與比較,我們就可以做到這一點。 所以:

class CustomComparer : Comparer<string>
    {            
        public override int Compare(string a, string b)
        {   
            //Jamiec fixed the line below.             
            return a.Replace("_", "").CompareTo(b.Replace("_", ""));
        }
    }


var customComparer = new CustomComparer();                                    
var element = elements.OrderBy(c => c.elementName, customComparer);

我仍然不確定我們試圖解決的實際模式,但我寫了我認為可以解決的問題。 我看到“_”是一種通配符,其中“abc2_”將是“abc_”的子集。 但是從OP的評論“bar_”<“barxyz”打破了我的理解。 這是我的代碼,當我獲得更多清晰度時,我可以修改。

static void Main(string[] args)
    {
        List<Element> Elements = new List<Element>();
        Elements.Add(new Element("abc_"));
        Elements.Add(new Element("abc2_"));
        Elements.Add(new Element("aaa"));

        var max = Elements.Max(e => e.Name.Length);
        var result = Elements.OrderBy(e => e.Name, new CustomComparer(max));

        foreach (var item in result)
            Console.WriteLine(item.Name);

        Console.Read();

    }

    class Element
    {
        public string Name { get; private set; }
        public Element(string name)
        {
            this.Name = name;
        }
    }

    class CustomComparer : Comparer<string>
    {
        private const string cWildCard = "_";
        private const char cHeavyChar = 'Z';
        public int Max { get; private set; }
        public CustomComparer(int max)
        {
            this.Max = max;
        }
        public override int Compare(string a, string b)
        {
            string comp1 = string.Empty, comp2 = string.Empty;

            int index = a.IndexOf(cWildCard);
            if (index > 0)
                comp1 = a.Substring(0, index).PadRight(this.Max, cHeavyChar);
            index = b.IndexOf(cWildCard);
            if (index > 0)
                comp2 = b.Substring(0, index).PadRight(this.Max, cHeavyChar);

            int result = comp1.CompareTo(comp2);
            return result;
        }
    }

你可以看到我只是在找到“_”的位置加權一個字。 如果這是在正確的軌道上,請告訴我。

使用CompareOptions.Ordinal就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM