如何跳转到列表中的子字符串

时间:2014-07-03 19:41:26

标签: c# linq list lambda

我用这个:

var temp =  conLines.Select((l, i) => new {l, i}).FirstOrDefault(r => (r.l.IndexOf(item.firstParam) >= 0 
     && r.l.IndexOf(item.secondParam) >= 0)
     && (r.l.IndexOf(item.firstParam) < r.l.IndexOf(item.secondParam)
));

但我不想开始&#34; FirstOrDefault&#34;直到我第一次找到conLines的某个子串(一个List)。

示例:

conLines看起来像这样:

NAME:

NOTES:

REVISION HISTORY:


format AT 1024 1  4

      1 AC       BUS      ENUM     0030 04    0 0 1/1   632

        NORMAL   04096 1  0,1

      2 AC       BUS-02   ENUM     00C0 06    0 0 1/1   632

        NORMAL   04096 1  0,1

我并不希望它开始寻找&#34; FirstOrDefault&#34;直到紧跟在以下行之后,但重要的是我仍然在整个conLines列表的上下文中跟踪temp.i

format AT 1024 1  4 

我想SkipWhile和StartsWith可能有效,但我没有取得任何成功

2 个答案:

答案 0 :(得分:1)

SkipWhile应该有效:

conLines.Select((s, i) => new {s, i})
        .SkipWhile(si => si.s != "format AT 1024 1  4")
        .Skip(1)         // skip to next line 
        .FirstOrDefault(si => si.s.IndexOf(item.firstParam) >= 0 
                           && si.s.IndexOf(item.secondParam) >= 0
                           && si.s.IndexOf(item.firstParam) < si.s.IndexOf(item.secondParam)
                       );

请注意,第二个IndexOf是多余的 - 如果A&gt; = 0且A&lt; B然后B> = 0。

答案 1 :(得分:1)

你的解决方案很接近。只需在.SkipWhile(o => o.l!= "format AT 1024 1 4")

之前添加.FirstOrDefault即可