C#LINQ&;解析信息

C#LINQ&;解析信息,c#,.net,linq,C#,.net,Linq,我试图找出搜索对象列表的最简单方法,并使用字符串中的数据来辅助搜索。下面是一个示例对象,有助于演示我正在尝试做的事情 public class Event { public DateTime timestamp; public int reason; public int data; public string comment; } “comment”包含一系列关于特定事件的额外信息,但是我需要搜索我的列表,查看是否满足三个条件,并返回满足条件的列表 数据>=7

我试图找出搜索对象列表的最简单方法,并使用字符串中的数据来辅助搜索。下面是一个示例对象,有助于演示我正在尝试做的事情

public class Event {
    public DateTime timestamp;
    public int reason;
    public int data;
    public string comment;
}
“comment”包含一系列关于特定事件的额外信息,但是我需要搜索我的列表,查看是否满足三个条件,并返回满足条件的列表

  • 数据>=75
  • 注释包含“Dist(6506.1m)”之类的内容
  • 该数字在上一步的字符串内>=500

  • 我可以通过常规编码和使用常规表达式来完成这一切,但我正在尝试找出是否有办法将其转换为单个LINQ查询。

    向事件类添加一个方法,该方法解析Dist(xxxx.xx)的注释行,以便在找到它并且xxx大于等于500时返回true

    public class Event
    {
        public DateTime timestamp;
        public int reason;
        public int data;
        public string comment;
    
        public bool HasDistMiniumum(int min)
        {
           add your regular expression code here that looks for Dist(xxxx) where xxxx is >= min...
        }
    
    // Use this Linq Line...
    var matchingItems = EventList.Where(item => item.data >= 75 && item.HasDistMinimum(500));
    

    当然可以用LINQ来做

    var regex = new Regex(@"(Dist\((\d*\.?\d*)m\))");
    var result = Events
        .Where(e => e.data >= 75)
        .Select(e => new {Result = regex.Match(e.comment), Event = e})
        .Where(o => double.Parse(o.Result.Groups[2].Value) >= 500)
        .Select(o => o.Event);
    
    为了更安全,您甚至可以在Where子句中使用TryParse:

    .Where(o => 
    {
        double number;
        double.TryParse(o.Result.Groups[2].Value, out number);
        return number >= 500;
    })
    

    您的
    if
    s将转换为
    Where
    。其余的几乎一样。您遇到的问题是什么?请您解释一下3?显示常规代码,我们会将其转换为LINQ@Tarik真正地我不知道这里有代码翻译服务。@Tarik No你应该考虑一下(主题:鼓励坏问题)是的,如果他能改变他的事件类,这是一个很好的答案。如果他不能改变事件类,他可以添加一个静态扩展类==>静态类EventExt{static bool HasDistMinimum(这个事件事件,以分钟为单位){…}通过使用
    Select
    只运行一次正则表达式,可以提高效率。这段代码将运行两次正则表达式。@IanNewson我已经用你的建议修复了它,很好,但是你不需要将
    e.Success&&
    添加到
    Where
    调用中吗?@IanNewson你的右边,捕捉得好。我刚刚意识到,这最终会选择匹配项并将其输出到结果。是否有办法检查此项并最终选择原始对象?是的,在
    select
    中,使用匹配项和原始对象创建一个新的匿名对象,例如
    select(e=>new{match=regex.match(e.comment),Event=e)