如何排序?
我有一个字符串列表,其中包含这样的值
11-03-2013
11-03-2013 -Count=2
11-03-2013 -count=1
11-04-2013 -Count=1
11-04-2013 -Count=2
11-04-2013
输出应该是,没有计数的那个应该在最后一个,最顶部应该是1然后是1,日期应该按升序排序。
11-03-2013 -Count=2
11-03-2013 -count=1
11-03-2013
11-04-2013 -Count=2
11-04-2013 -Count=1
11-04-2013
我尝试了这段代码,但这是通过降序排序
var edates= edates.OrderBy(e => e.Replace("-count=1", string.Empty).Replace("-count=2", string.Empty)).ToList();
我知道一个带属性的简单类可以做到这一点,但这样做需要更改其他需要大量工作的方法。
此致
答案 0 :(得分:3)
这是因为你比较字符串而不是日期。创建两个函数:第一个子字符串日期部分并解析它,第二个子字符串计数部分并返回解析的计数(如果长度<11,则返回0)然后yourList.OrderBy(s=> f1(s)).ThenByDescending(s=> f2(s))
答案 1 :(得分:2)
这是@Guru Stron的代码解决方案
private static void sortList()
{
var dates = getDates();
var sorted = dates.OrderBy(f1).ThenByDescending(f2);
}
private static DateTime f1(string parse)
{
return DateTime.Parse(parse.Substring(0, 10));
}
private static int f2(string parse)
{
int sort;
if (parse.Length > 10) int.TryParse(parse.Substring(18), out sort);
else sort = 0;
return sort;
}
答案 2 :(得分:1)
首先需要按日期排序,然后按字符串的其余部分排序,降序;
edates =
edates.OrderBy(x =>
DateTime.ParseExact(x.Substring(0, 10), "MM-dd-yyyy",
CultureInfo.InvariantCulture))
.ThenByDescending(x => x.Substring(10))
.ToList();
答案 3 :(得分:0)
以下内容应按不同年份和计数&gt; = 10 按顺序排列。
这不是“最快”的方法(并且它肯定不适用于L2S / EF LINQ提供程序),但它应该正确地对给定格式进行排序和在无效时快速失败值。我可能会像这样编写代码(或使用等效设置的IComparer
) - 主要是因为它对我来说“读起来很简单”。
DateTime OrderableItem (string e) {
var date = e.Substring(0, 10);
return DateTime.ParseExact(date, "MM-dd-yyyy", CultureInfo.InvariantCulture)
}
int OrderableCount (string e) {
var m = Regex.Match(e, @"-count=(\d+)$", RegexOptions.IgnoreCase);
return m.Success
? int.Parse(m.Groups[1].Value)
: 0;
}
var res = seq.OrderBy(OrderableDate)
.ThenBy(OrderableCount);
我更喜欢接收数据,而不是排除数据。
答案 4 :(得分:0)
你应该使用一个真正的类来简化事物并有一个适当的表示。也就是说,您可以使用LINQ查询语法并利用let
子句存储将文本拆分为空格和等号的结果。如果拆分结果有多个元素,我们可以假设计数存在。接下来,我们按日期排序(在解析之后),然后解析计数(降序)。
尝试这种方法:
string[] inputs =
{
"11-03-2013",
"11-03-2013 -Count=2",
"11-03-2013 -Count=1",
"11-04-2013 -Count=1",
"11-04-2013 -Count=2",
"11-04-2013"
};
var query = from input in inputs
let split = input.Split(' ', '=')
let count = split.Length > 1 ? int.Parse(split[2]) : 0
orderby DateTime.Parse(split[0]), count descending
select input;
foreach (var item in query)
{
Console.WriteLine(item);
}