0

我有这样的情况。我有一个列表,其中包含日期和时间的字符串,格式如下:05-04-2011 12:42:03.199. 我希望能够根据在 datetimepicker 和我的自定义 timepicker 中选择的日期来过滤这个列表。我将两个值都保存到字符串string try1 = timePicker1.Value.ToString();string try2 = dateTimePicker5.Value.ToString("dd-MM-yyyy"). 我已经完成了这样的过滤view

view2.RowFilter = "TimeColumn >= '" 
                  + dateTimePicker5.Value.ToString("dd-MM-yyyy") + " " 
                  + try1 
                  + "' and TimeColumn <= '" 
                  + dateTimePicker4.Value.ToString("dd-MM-yyyy") + " " 
                  + try2 + "'";

我想知道如何使用 linq 执行此操作并将结果保存到新列表?是否可以通过从顶部和底部的减少来过滤它?

希望我说得很清楚。不只是告诉我,我会尝试解释更多!

4

1 回答 1

1

为什么要存储DateTimeas String?为什么你有一个List<String>which contains DateTimes?您应该始终使用最合适的数据类型并最后将其转换为字符串。

但是,这应该有效:

string dateFormat = "dd-MM-yyyy HH:mm:ss.fff";
IEnumerable<string> filtered = strings
    .Select(str => new { str, dt = DateTime.ParseExact(str, dateFormat, CultureInfo.InvariantCulture) })
    .Where(x => x.dt >= start && x.dt <= end)
    .OrderBy(x => x.dt) // if you want to order by the datetime value
    .Select(x => x.str); 

此查询获取每个字符串并用于DateTime.ParseExact将其转换为DateTime. 然后它创建一个匿名类型( new{ .... }),它有两个属性,原始string的和由属性和你的开始值和结束值DateTime过滤的和。剩余项目按日期时间(奖金)排序。最后选择了字符串,因为我假设这是您想要的结果。Enumerable.WhereDateTime

如果您需要具体化查询,您可以使用ToList或简单的foreach.

foreach(string strDate in filtered)
{
    Console.WriteLine( strDate );
}

根据您的评论编辑:

好的,那么当我的主行看起来像这样 05-04-2011 12:42:04.160,Event dssd(23).dfgg[2] 1 xx:3332,还有一些文本时,如何将其保存为 Datetime。我像这样分隔这些行并将每个部分保存到字符串数组 string[] _columns = line.Split(",".ToCharArray()); 中。如何将第一部分保存为日期时间并将其余部分保存为字符串?

string dateFormat = "dd-MM-yyyy HH:mm:ss.fff";
string[] lines = new[]{"05-04-2011 12:42:04.160,Event dssd(23).dfgg[2] 1 xx:3332,some more text"};
var lineIfos = lines.Select(s => s.Split(','))
    .Select(split => new{ 
        date = DateTime.ParseExact(split[0].Trim(), dateFormat, CultureInfo.InvariantCulture),
        rest = string.Join(",", split.Skip(1))
    })
    .Where(x => x.date >= start && x.date <= end)
    .OrderBy(x => x.date);

foreach (var x in lineIfos)
    Console.WriteLine("date:{0}  rest of the line:{1}"
        ,x.date.ToString("d")
        ,x.rest);
于 2013-09-03T12:07:19.860 回答