【问题标题】:List<string> Custom SortingList<string> 自定义排序
【发布时间】:2012-11-18 06:26:12
【问题描述】:

我目前有一个 List&lt;string&gt; 对象,它存储以下 HTML 字符串,主要是 URL,例如

List[0] = "<a href='#' id='1'>Banana</a>";
List[1] = "<a href='#' id='2'>Orange</a>";
List[2] = "<a href='#' id='3'>Apple</a>";
List[3] = "<a href='#' id='4'>Mango</a>";
...

而且,当我对List&lt;string&gt; 对象进行排序时,通过执行URLList.Sort(); (assume thatURLListobject has been instantiated.),它给出了这样的顺序,Banana=>Orange=>Apple=>Mango,这不是正是我想要的。

我想根据这些水果的字母顺序对其进行排序,例如 Apple=>Banana=>Mango=>Orange

那么我怎样才能实现这种自定义排序呢?有什么建议?谢谢。

【问题讨论】:

    标签: c# asp.net list sorting


    【解决方案1】:

    如果您想要一种简单的方法,并且希望您的数组不会发生太大变化:

    2012 年 11 月 30 日编辑

    List.Sort((x, y) => x.Substring(x.IndexOf(">") + 1, 1).CompareTo(y.Substring(y.IndexOf(">") + 1, 1)));
    

    【讨论】:

    • 谢谢。这也很好用。如此好的和简单的解决方案。
    • @woodykiddy Woody,我刚刚意识到需要进行更改,在 .CompareTo() 中您需要使用 y.indexof 而不是 x.indexof。我已将帖子编辑为正确的代码。由于所有字符串在实际单词之前的长度相同,因此它与指定的错误别名一起使用,但是当您到达 id ='9' 与 id = '10' 相比时会出错。
    • 感谢编辑和 cmets。这非常有帮助。我还在 Substring() 之后添加了 .ToUpper() 所以它会忽略大小写。
    【解决方案2】:

    我会考虑将您的 List&lt;string&gt; 变成 List&lt;KeyValuePair&lt;string, string&gt;&gt;。您可以将Key 设置为“Banana”、“Apple”等并将Value 设置为网址本身来填充它。然后就可以对Key进行排序了。

    【讨论】:

    • 希望它有效。如果更改对象会干扰应用程序的其他方面,请考虑@KreepN 提供的答案。
    【解决方案3】:

    默认排序对于stringsalphabetical,在这种情况下由idattribute控制,因为那是不同的字符串的第一部分。您可能希望使用 sort which takes a comparison object 的版本并提供您的 自己的比较函数,它可以正确解析您的标签并返回订单。或者,将您的 HTML 标记读入一个类,并将其存储为这些对象的列表,这会使代码更具可读性。

    【讨论】:

      【解决方案4】:

      这是意料之中的。您正在对简单字符串进行排序,它们的第一个不同之处在于 id 属性的值。

      我假设它正在调用ToString() 来确定排序顺序,因此您可以尝试覆盖它以仅返回内部文本。但我真的认为你需要一个类,而不仅仅是字符串。

      【讨论】:

        【解决方案5】:

        我是 C# 和 ASP.NET 的新手,但也许您可以使用 System.Web.UI.WebControls.HyperLink 代替字符串:

        List<HyperLink> links = new List<HyperLink>();
        
        links.Add(new HyperLink() { NavigateURL = "#", ID = "1", Text = "Banana" });
        links.Add(new HyperLink() { NavigateURL = "#", ID = "2", Text = "Apple" });
        links.Add(new HyperLink() { NavigateURL = "#", ID = "3", Text = "Orange" });
        links.Add(new HyperLink() { NavigateURL = "#", ID = "4", Text = "Mango" });
        
        links.Sort((x, y) => x.Text.CompareTo(y.Text));
        

        然后可以将这些链接附加到页面上的另一个控件,例如 &lt;div&gt; 等:

        Control parent = Page.FindControl("id-of-control");
        foreach (HyperLink l in links)
            parent.Controls.Add(l);
        

        【讨论】:

          【解决方案6】:

          因为在您的列表中,字符串&lt;a href='#' id='1'&gt;Banana&lt;/a&gt; 包含id 属性,其值为1,它小于&lt;a href='#' id='2'&gt;Orange&lt;/a&gt;,其id 值为2。所以URLList.Sort();的结果是正确的。

          我认为你需要创建自己的String类,并重写equals函数,或者实现Comparable接口,然后重写compare函数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-09-27
            • 1970-01-01
            • 2012-04-20
            • 2016-11-25
            • 1970-01-01
            • 2018-01-19
            • 2012-11-29
            相关资源
            最近更新 更多