3

我目前有一个List<string>存储以下 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<string>对象进行排序时,通过执行URLList.Sort(); (assume thatURLList object has been instantiated.),它给出了这样的顺序Banana=>Orange=>Apple=>Mango,这并不是我想要的。

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

那么如何实现这种自定义排序呢?有什么建议么?谢谢。

4

6 回答 6

6

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

2012 年 11 月 30 日编辑

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

在此处输入图像描述

于 2012-11-30T03:15:33.923 回答
1

我会考虑把你List<string>变成一个List<KeyValuePair<string, string>>. Key您可以使用设置为“Banana”、“Apple”等以及Valueurl 本身来填充它。然后就可以排序了Key

于 2012-11-30T02:59:39.530 回答
0

字符串默认排序按字母顺序排列的,在这种情况下由id属性控制,因为这是字符串的第一部分不同。您可能希望使用带有比较对象的sort版本并提供您自己的比较函数,该函数可以正确解析您的标签并返回顺序。或者,将您的 HTML 标记读入一个类,并将其存储为这些对象的列表,这将使代码更具可读性。

于 2012-11-30T02:58:02.433 回答
0

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

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

于 2012-11-30T02:58:31.640 回答
0

我是 C# 和 ASP.NET 的新手,但也许你可以使用 aSystem.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));

然后可以将这些链接附加到页面上的另一个控件,例如 a<div>等:

Control parent = Page.FindControl("id-of-control");
foreach (HyperLink l in links)
    parent.Controls.Add(l);
于 2012-11-30T03:07:24.050 回答
-1

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

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

于 2012-11-30T02:58:49.377 回答