OrderBy是字符串的数字(不能转换为int)

时间:2015-06-10 11:44:43

标签: c# .net string linq list

我正在尝试对List<string>进行排序,其中包含每个数字后跟字母的元素列表。这就是为什么每个元素都不能简单地转换为int。该列表在运行时生成,但是例如,列表可能包含以下元素:

10 dog, 53 cow, 2 crow, 29 horse, 12 rabbit, 107 frog, 35 cat, 7 dragon

我尝试过像这样排序:

public void Compare()
{   
   sortedList = sortedList.OrderBy(g => g).ToList(); 
}

结果:

10 dog, 107 frog, 12 rabbit, 2 crow, 29 horse, 35 cat, 53 cow, 7 dragon

显然它是按字母顺序排序的,因为在这个例子中107出现在12之前,107中的“10”小于12.但是我需要按照它将按照单词前面的数字顺序返回的方式对其进行排序。

我需要这个例子来返回:

2 crow, 7 dragon, 10 dog, 12 rabbit, 29 horse, 35 cat, 53 cow, 107 frog

我对编码很新,这让我完全难过。关于如何达到理想结果的任何建议?

9 个答案:

答案 0 :(得分:3)

您可以提取所需的数据,然后按

执行订单
var sorted = list
    .Select(x => new
    {
        Splited = x.Split(),
        Raw = x
    }) //split the string and keep the raw value
    .Select(x => new
    {
        Count = int.Parse(x.Splited[0]), // extract the number 
        Raw = x.Raw
    })
    .OrderBy(x => x.Count) //order by that number
    .Select(x => x.Raw); //select raw value

答案 1 :(得分:1)

我知道这不是你要求的。我也看到有很多答案可以完全满足你的要求。 这是一个建议

我不知道你的系统或任何东西,但我认为通过处理你的对象作为字符串是一个错误。我非常确定你的系统可以从拥有和对象中受益,而不是代表你的对象的这个字符串。通过创建一个简单的对象,甚至是

public class Animal
{
    public string Name{ get; set }
    public int Index{ get; set; }
}

您可以在许多地方获得类型安全。它会变得更容易修改(在你当前的系统中尝试添加第三个属性,如Type [“Mammal”,“Reptile”,“Fish”等],你会理解我在说什么)。如果您需要将该对象显示为您拥有的字符串,则可以始终覆盖此对象的ToString(),如描述here

public override string ToString() 
{
    return string.Format("{0} {1}", Index, Name);
}

现在,当您需要对对象进行排序或对其进行任何操作时,它变得更加简单,因为您有一个常规对象而不是包含对象的字符串。

答案 2 :(得分:0)

正如您已经确定的那样,问题在于您不能OrderBy字符串。您希望对数字部分上的列表进行排序,将其视为数字。

我们会告诉parts[0]在该部分订购,方法是在第一个空格上拆分字符串,将第一部分int转换为Select并对该值进行排序

无需使用OrderBy,存储原始值等。只需原始List上的简单namespace SortListTest1 { using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { var animals = new List<string> { "10 dog", "53 cow", "2 crow", "29 horse", "12 rabbit", "107 frog", "35 cat", "7 dragon" }; var orderedAnimals = animals.OrderBy( x => { var parts = x.Split(' '); // split on first space return int.Parse(parts[0]); // i.e. the numeric part, cast to an int }); foreach (var orderedAnimal in orderedAnimals) { Console.WriteLine(orderedAnimal); } } } }

2 crow
7 dragon
10 dog
12 rabbit
29 horse
35 cat
53 cow
107 frog
Press any key to continue . . .
choice ==

答案 3 :(得分:0)

使用这些行进行排序:

List<string> L = new List<string> { "10 dog", "53 cow", "2 crow", "29 horse", "12 rabbit", "107 frog", "35 cat", "7 dragon" };

var sort = from s in L
           orderby Convert.ToInt32(s.Split(' ')[0]) 
           select s;

答案 4 :(得分:0)

我建议使用字典而不是使用字符串列表。您的数据结构看起来像是键值的形式。

Dictionary<int,string> Animals = new Dictionary<int,string>();

让关键部分取整数部分,让字符串部分处理名称部分。

然后您可以轻松地对数据结构进行排序,如下所示

sortedAnimalList = Animals.OrderByAscending(a => a.Key);

答案 5 :(得分:0)

使用空格作为分隔符拆分字符串,取第一个值并将其转换为int

sortedList = sortedList
    .OrderBy(g => Int32.Parse(g.Split(' ')[0]))
    .ToList()

答案 6 :(得分:0)

我建议采用不同的方法:您有(countname)对(或(idname)对)的列表,其中{{ 1}}是您的数据对象,name是量词。

  1. 解析您的数据以将其拆分为原子值(在本例中为countint
  2. 将值放入符合您需求的指定结构中(此处只是属性string)。
  3. 将数据对象组装到适当的容器类中(如nameList`1
  4. 如果没有排序,请对其进行排序;您可能需要让您的数据结构/类实现Dictionary`2 / IComparable`1或定义自定义IComparable

  5. 以下是我提出的建议:

    <强>代码:

    IComparer`1

    <强>输出: enter image description here

答案 7 :(得分:0)

lst = lst.OrderBy(x => Convert.ToInt32(x.Split()[0])).ToList();

答案 8 :(得分:0)

试试这个

sortedList.OrderBy(g => int.Parse(g.Split(' ').First())).ToList();