列出基于日期的过滤器

时间:2013-09-03 11:57:29

标签: c# winforms linq filtering

我有这样的情况。我有一个列表,其中包含日期和时间的字符串,格式为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并将结果保存到新列表中?是否可以通过从顶部和底部减少来过滤它?

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

1 个答案:

答案 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{ .... }),其中包含两个属性,原始stringDateTime以及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);