C# lambda字符串按日期顺序编号

C# lambda字符串按日期顺序编号,c#,linq,lambda,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 -Co

如何分类

我有一个字符串列表,值如下

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(); 
我知道一个具有属性的简单类可以做到这一点,但这样做需要更改其他方法,这需要大量的工作


这是因为比较字符串而不是日期。创建两个函数:第一个子字符串日期部分并对其进行解析,第二个子字符串计数部分并返回解析后的计数(如果长度<11,则返回0),然后返回
yourList.OrderBy(s=>f1(s))。然后按降序(s=>f2(s))

以下应根据需要在不同年份和计数>=10之间排序

这不是“最快”的方法(而且它肯定不会与L2S/EF LINQ提供程序一起工作),但它应该正确地对给定格式排序,并在无效值上快速失败。我可能会这样写代码(或者使用一个具有同等设置的
IComparer
),主要是因为它对我来说“读起来很简单”


我更喜欢使用数据,而不是排除数据。

你应该使用一个真实的类来简化事情,并有一个适当的表示。也就是说,您可以使用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);
}

首先需要按日期排序,然后按字符串的其余部分降序排序

    edates =
        edates.OrderBy(x => 
               DateTime.ParseExact(x.Substring(0, 10), "MM-dd-yyyy", 
               CultureInfo.InvariantCulture))
            .ThenByDescending(x => x.Substring(10))
            .ToList();

下面是@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;
}

@muctadir感谢您更正了格式Create to functions:第一个子字符串为部分添加日期并对其进行解析,第二个子字符串为计数部分并返回解析后的计数(如果长度<9,则返回0),然后返回
yourList.OrderBy(s=>f1(s))。然后再返回by(s=>f2(s))
@GuruStron如果可能的话,如果您能给出代码,我将不胜感激。对不起,我用汤匙喂食。我非常感谢您的帮助。:-)让我看一下代码。@GuruStron你的想法是最好的,我实现了它的代码,希望我做得很好。这可以处理日期排序,但不能处理
count=x
排序。@paqogomez很好。对不起,我有点困惑。你是说我会在列表上迭代并逐个解析edates吗?@Mico查看我对上师Stron的实现idea@Mico是的,当然。抱歉,耽搁了,因为我看到有很多代码示例用于解析,所以我不提供我的。如果你对同一日期有很多的值,你可以首先考虑代码> GroupBy(S= = S.子串(0, 10))< /C>,然后通过它解析和排序,但是不确定这会快得多,但是为了得到正确的排序,你仍然需要解析日期和计数输出成为第一个值应该是2而不是1。现在发生的事情是:11-04-2013-计数=11-04-2013-计数=2 11-04-2013@paqogomez,通过降序对
进行了很大的修正,但是对于解析来说可能更好
parse.Substring(18)
,如果是大的counts@Mico我不知所措,它在我这边运行得很好。您正在解析的字符串是否有18个字符长?我将添加我的GetDates()方法,以便您可以确切地看到我在做什么。@paqogomez感谢您为我节省时间。:-)它是伟大的working@Mico,np,帕库戈麦斯完成了任务,并花了更多的时间)很乐意帮忙)
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;
}