将foreach循环更改为LINQ查询

时间:2012-05-22 16:54:32

标签: c# linq

我陷入了一个简单的场景。我有一个List<string>对象,它的所有项目都有:

item_1_2_generatedGUID //generatedGUID is Guid.NewGuid()

但可能会有更多数字 item_1_2_3_4_5_generatedGUID

现在,我想知道如何将该循环更改为LINQ的查询。有什么想法吗?

  string one = "1"; //an exaplme
  string two = "2"; //an exaplme

  foreach (var item in myStringsList)
  {
      string[] splitted = item.Split(new char[] { '_' },
                                     StringSplitOptions.RemoveEmptyEntries);

      if(splitted.Length >= 3)
      {
          if(splitted[1] == one && splitted[2] == two)
          {
              resultList.Add(item);
          }
      }
  }

4 个答案:

答案 0 :(得分:3)

var result = from s in lst 
             let spl = s.Split('_')
             where spl.Length >= 3 && spl[1] = one  && spl[2] == two
             select s;

答案 1 :(得分:2)

试试这个:

var query = from item in myStringsList
            let splitted = item.Split(new[] { '_' }, SSO.RemoveEmptyEntries)
            where splitted.Length >= 3
            where splitted[1] == one && splitted[2] == two
            select item;

var resultList = query.ToList();

答案 2 :(得分:2)

这是一种不同的方法:

var items = myStringsList.
            Where(x => x.Substring(x.IndexOf("_")).StartsWith(one+"_"+two+"_"));

您可能需要在IndexOf中添加+1,但我不确定。

它的作用是:

  • 删除第一个项目(这是子字符串)。在您的示例中,它应为“1_2_3_4_5_generatedGUID”
  • 检查字符串是否符合您的预期。在您的示例中:1_2 _

答案 3 :(得分:0)

已编辑:在第一个“位置”添加了任何模式

var result = items.Where(i => Regex.IsMatch(i, "^[^_]_1_2_"));