使用强力按字典顺序排列List <object>

时间:2016-04-28 12:20:45

标签: c# lexicographic

那是我的代码......

string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse quis nisl vitae dolor tempus iaculis at id augue. Nullam metus mauris, viverra vitae tristique sed, pulvinar ac nulla."

List<object> listCarac = new List<object>();
object aux = 0;

text.Replace(" ", "");

for (int i = 0; i < text.Count(); i++)
{
    listCarac.Add(text.Substring(i,1));
}

for (int x = 0; x < listCarac.Count(); x++)
{
    for (int y = x + 1; y < listCarac.Count(); y++)
    {
        if (listCarac[x] > listCarac[y]) // My problem is here
        {
            aux = listCarac[x];
            listCarac[x] = listCarac[y];
            listCarac[y] = aux;
        }
    }
}

我的问题是如何按字典顺序进行比较,我想if是按字母顺序比较。 感谢。

3 个答案:

答案 0 :(得分:0)

您的列表包含object类型的实例,但未实现IComparable,因此您无法调用instance1 < instance2。但是,由于您只将单个字符放入列表中,我猜您可以使用List<char>代替甚至更简单string而不是列表。

因此你现在可以这样称呼:

listCarac = listCarac.OrderBy(x => x).ToList();

这会以字面顺序排列你的角色。

此外,当调用string.Replace时,方法返回结果,因为字符串是不可变的。因此,在第一个循环中,您使用text的原始内容而不是替换的内容。请改用:text = text.Replace(" ", "");

编辑:如果 - 正如您在评论中声明的那样 - 您必须使用object列表以及此列表中的所有实例IComparablechar可以)在排序之前简单地将实例强制转换为接口:

var result = listCarac.OfType<IComparable>().OrderBy(x => x);

答案 1 :(得分:0)

我们对object了解不多,但我们知道IComparable项目。

我建议您将列表更改为

var listCarac = new List<IComparable>();

而不是使用接口方法CompareTo

int CompareTo(
    object obj
)

哪个会改变

if (listCarac[x] > listCarac[y])

if (listCarac[x].CompareTo(listCarac[y]) > 0)

答案 2 :(得分:0)

我认为您可以利用为List提供的SORT方法。如有必要,您可以提供比较器来处理特定情况。

String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse quis nisl vitae dolor tempus iaculis at id augue. Nullam metus mauris, viverra vitae tristique sed, pulvinar ac nulla.";
text = text.Replace(" ", "");
List<char> demo = text.ToCharArray().ToList();
demo.Sort();
string result = System.Text.Encoding.UTF8.GetString(demo.Select(c => (byte)c).ToArray());