我正在尝试按逗号分割字符串。但它表现不如预期
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
我想在一行代码上实现它。
答案 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
答案 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.
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();
结果与要求一致:{ "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