2

私は簡単なシナリオで立ち往生しました。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

4 に答える 4

3
var result = from s in lst 
             let spl = s.Split('_')
             where spl.Length >= 3 && spl[1] = one  && spl[2] == two
             select s;
于 2012-05-22T17:00:44.750 に答える
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();
于 2012-05-22T16:56:53.083 に答える
2

これは別のアプローチです。

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

おそらくIndexOfに+1を追加する必要がありますが、よくわかりません。

それが何をするか:

  • 最初の項目(の部分文字列)を削除します。あなたの例では、「1_2_3_4_5_generatedGUID」である必要があります
  • 文字列が期待どおりに始まっていることを確認します。あなたの例では:1_2_
于 2012-05-22T17:07:13.543 に答える
0

編集:最初の「位置」に何かのパターンを追加

var result = items.Where(i => Regex.IsMatch(i, "^[^_]_1_2_"));
于 2012-05-22T17:09:02.890 に答える