我有这样的情况。我有一个列表,其中包含日期和时间的字符串,格式为05-04-2011 12:42:03.199
。我希望能够根据datetimepicker和我的自定义时间选择器中选择的日期过滤此列表。我将这两个值保存到字符串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并将结果保存到新列表中?是否可以通过从顶部和底部减少来过滤它?
希望我说得很清楚。不只是告诉我,我会尝试解释更多!
答案 0 :(得分:1)
为什么将DateTime
存储为String
?为什么你的List<String>
包含DateTime
?您应始终使用最合适的数据类型并将其最后转换为字符串。
但是,这应该有效:
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.Where
属性的DateTime
过滤器和您的开始 - 和结束价值。剩余项目按日期时间(奖金)排序。最后选择了字符串,因为我认为这是你想要的结果。
如果您需要实现查询,可以使用ToList
或简单的foreach
。
foreach(string strDate in filtered)
{
Console.WriteLine( strDate );
}
根据您的评论修改:
好的,那么当我的主线看起来如何时,如何将其保存为日期时间 这个05-04-2011 12:42:04.160,事件dssd(23).dfgg [2] 1 xx:3332,一些 更多文字。我正在将这些行分开并保存每个部分 into string array 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);