lambda字符串按日期排序,带数字

时间:2013-11-19 05:39:56

标签: c# linq lambda

如何排序?

我有一个字符串列表,其中包含这样的值

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(); 

我知道一个带属性的简单类可以做到这一点,但这样做需要更改其他需要大量工作的方法。

此致

5 个答案:

答案 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);
}