将字符串拆分为数组和排序数组

时间:2017-08-08 06:35:22

标签: c# .net arrays linq sorting

我正在尝试按逗号分割字符串。但它表现不如预期

var classes = "10,7,8,9";
Console.Write(string.Join(",", classes.Split(',').OrderBy(x => x)));
Console.ReadKey();

,输出

  

10,7,8,9

但我希望预期输出如下:

  

7,8,9,10

类可以包含一个部分。像7a,7b

我想在一行代码上实现它。

6 个答案:

答案 0 :(得分:3)

您可以像这样使用正则表达式

var classes = "10,7,8,9";
Regex number = new Regex(@"^\d+");
Console.Write(string.Join(",", classes.Split(',').OrderBy(x => Convert.ToInt32(number.Match(x).Value)).ThenBy(x => number.Replace(x, ""))));
Console.ReadKey();

答案 1 :(得分:1)

CODE:

    $message = new YiiMailMessage;
    $message->setBody('Message content here with HTML', 'text/html');
    $message->subject = 'xyz';
    $message->addTo('xyz@xyz.com');
    $message->from = 'xyz@xyz.com';
    Yii::app()->mail->send($message);

输出: 1D 9C 25B 30A

在线编辑: http://rextester.com/CKKQK66159

答案 2 :(得分:1)

使用以下using - 指令:

using System.Text.RegularExpressions;

尝试以下方法:

var input = "7,7a,8,9a,9c,9d,10";
var sorted = from sp in input.Split(',')
             let reg = Regex.Match(sp, @"(?<num>[0-9]+)(?<char>[a-z]*)", RegexOptions.IgnoreCase | RegexOptions.Compiled)
             let number = int.Parse(reg.Groups["num"].ToString())
             orderby reg.Groups["char"].ToString() ascending // sort first by letter
             orderby number ascending // then by number
             select sp;
var result = string.Join(",", sorted);

Console.WriteLine(result);
//output (tested): 7,7a,8,9a,9c,9d,10

它使用正则表达式来确定输入字符串的数字和字母部分。 正则表达式模式使用命名组,如下所示:(?<group_name> regex_expr )

<小时/> 如果您担心大量数字,上面代码的时间复杂度为O(n log(n))

<小时/> More information about named Regex groups.
More information about LINQ.
... and about the orderby-clause.

答案 3 :(得分:0)

全部在一行,也支持'4a'等。

编辑:在测试时,1,2,111,3之类的字符串会显示为111,1,2,3,因此可能不是您想要的。

        string str = "1,2,3,4a,4b,5,6,4c";
        str.Split(',').OrderBy(x => x).ToList().ForEach(x=> Console.WriteLine(x));
        Console.ReadKey();

答案 4 :(得分:0)

这是我的实施:

IEnumerable<Tuple<string, string[]>> splittedItems =
    items.Select(i => new Tuple<string, string[]>(i, Regex.Split(i, "([0-9]+)")));

List<string> orderedItems = splittedItems.OrderBy(t => Convert.ToInt16(t.Item2[1]))
    .ThenBy(t => t.Item2.Length > 1 ? t.Item2[2] : "1")
    .Select(t => t.Item1).ToList();
  1. 将输入拆分为数字和非数字字符
  2. 将分割的字符串存储为其父字符串
  3. 按号码排序
  4. 然后按非数字字符排序
  5. 排序后再次获取父字符串
  6. 结果与要求一致:{ "10", "7", "8b", "8a", "9" }已排序为{ "7", "8a", "8b", "9", "10" }

答案 5 :(得分:0)

你正在排序字符串(按字母顺序排列),所以是的,“10”出现在“7”之前。

我的解决方案将“10,7b,8,7a,9b”转换为“7a,7b,8,9b,10”(首先按整数前缀排序,然后由子串本身。)

解析字符串前缀的辅助方法:

WHERE

用整数前缀然后用字符串本身对子字符串进行排序:

private static int IntPrefix(string s)
    => s
    .TakeWhile(ch => ch >= '0' && ch <= '9')
    .Aggregate(0, (a, c) => 10 * a + (c - '0'));

一个班轮(classes.Split(',') // string[] .Select(s => new { s, i = IntPrefix(s) }) // IEnumerable<{ s: string, i: int }> .OrderBy(si => si.i) // IEnumerable<{ s: string, i: int }> .ThenBy(si => si.s) // IEnumerable<{ s: string, i: int }> .Select(si => si.s) // IEnumerable<string> ):

string.Join