2013-07-27 5 views
6

私はList<string>にいくつかの単語があります。 私はすべての要素を取得したい、魔法使いはこのスキーマの文字を含んでいます: a00b0c000d - 0はランダムな文字ですa,b,c,d - 常に文字列のcharsです。C#に文字を含むリストを検索する

どうすればいいですか?正規表現でのみこれを行うことはできますか?他の解決策はありませんか?

答えて

5

まあ、代わりに正規表現のあなたは、それぞれの位置での特定の文字を確認するためにLINQを使用することができます。しかし、私は間違いなく正規表現を好むだろう。

var result = yourList 
    .Where(x => x[0] == "a") 
    .Where(x => x[3] == "b") 
    .Where(x => x[5] == "c") 
    .Where(x => x[9] == "d") 
    .ToList(); 
2

さて、あなたは正規表現とLINQでそれを行うことができます。

Regex yourRegex = new Regex(@"a..b.c...d"); 
//if you want whole string match use ^a..b.c...d$ 
var result = yourList.Where(yourRegex.IsMatch); 
+0

リストに '^'と '$'という行アンカーの開始と終了がありませんか?リストに長い文字列が含まれている場合は? –

+0

@ O.R.Mapperそれは含まれていると言われています。しかし、私はオプションとしてそれを追加します。 –

+1

ああ、実際には、質問がどのように解釈されるか(そして、これのように解釈される回答のいくつか)によって、「特定の位置にある」を読むことができます - 実際には、文字列の境界に関して絶対的ではありません。 –

1

IndexOfAny()は、リストをループした後に文字列として使用できます。 IndexOfAnyは、多くの値の文字列を検索します。

List<string> words = new List<string>(); 
foreach(string word in words) 
{ 
    int match = word.IndexOfAny(new char[] {'a', 'b', 'c', 'd'}); 
    if(match!=-1) 
    { 
     //Processing Logic here 
    } 
    } 
  • これは、Unicode文字の指定された配列内の任意の文字がこのインスタンスで最初に見つかったの指標を報告します。
  • 配列の文字がこのインスタンスに見つからない場合、このメソッドは-1を返します。
+0

定義上、IndexOfAnyは最初に見つかったインデックスだけを返しませんか?あるいは、与えられたパラメータの中のすべての文字をチェックしますか? – KappaG3

0

正規表現を使用せずに、あなたはおそらく、あなたが後にある結果を得るには

 List<string> stromgs = new List<string>(); 

     foreach (var s in stromgs) 
     { 
      var sa = s.Select(c => c.ToString(CultureInfo.InvariantCulture)).ToArray(); 

      if (sa.Contains("a") && sa.Contains("b") && sa.Contains("c") && sa.Contains("d")) 
       yield return s; 
     } 

の線に沿って何かを行うことができます。私はこのコードをプロファイリングしていないので、私が知っているすべての正規表現を使用するよりも速度が遅くなる可能性がありますが、Regex(通常は何かをする傾向があります)を避ける方法が必要です。

1

効率的な方法は、リストを反復することです。

List<string> matches = new List<string>(); 
myList.ForEach((x) => { if(x[0] == 'a' && x[3] == 'b' && x[5] == 'c' && x[9] == 'd') matches.Add(x); }); 

それとも、少し遅いがボトルネックになる可能性は低いかもしれないLINQを使用することができます。

関連する問題