2011-11-29 60 views
3

我有很長串S可能包含模式的字符串p1, p2, p3, ....;Linq的語句獲取未串長串

所有模式置於MatchCollection對象

我想做些什麼像

string ret=p_n if !(S.Contains(p_n)) 

我寫一個循環做到這一點

foreach(string p in PatternList) 
{ 
    s=(!S.contain(p.valus))?p.value:""; 
} 

我想知道一個LINQ聲明使我的cocde更加優雅。

+0

爲了澄清,你想匹配的模式列表中,最後一場比賽,或者列表matchcollection的返回一串「」對非匹配,匹配值的大小比賽? – deepee1

+0

我認爲你的問題標題有點誤導。您指出所有模式都放在MatchCollection中,但要求使用LINQ語句來檢查不是標題中較長字符串的一部分的字符串。問題正文中的p.valus表示您真的在查看來自MatchCollection的Match,而不是不是長字符串的子字符串的字符串。 –

回答

4
var patterns = new List<string> { "one", "two", "three" }; 

var misses = patterns.Where(s => !longString.Contains(s)); 
0
class Program 
{ 
    static void Main(string[] args) 
    { 
     string S = "12345asdfasdf12w3e412354w12341523142341235123"; 

     string patternString = "one1234554321asdf"; 


     MatchCollection p_ns = Regex.Matches(patternString, "one|12345|54321|asdf"); 

     var nonMatches = (from p_n in p_ns.Cast<Match>() 
          where !S.Contains(p_n.Value) 
          select p_n.Value); 

     foreach (string nonMatch in nonMatches) 
     { 
      Console.WriteLine(nonMatch); 
     } 
     Console.ReadKey(); 
    } 
} 

或者用Justin的方法,從他的回答,你也可以使用下面的變化。

class Program 
{ 
    static void Main(string[] args) 
    { 
     string S = "12345asdfasdf12w3e412354w12341523142341235123"; 

     string patternString = "one1234554321asdf"; 


     MatchCollection p_ns = Regex.Matches(patternString, "one|12345|54321|asdf"); 

     var nonMatches = p_ns.Cast<Match>().Where(s => !S.Contains(s.Value)); 

     foreach (Match nonMatch in nonMatches) 
     { 
      Console.WriteLine(nonMatch.Value); 
     } 


     Console.ReadKey(); 
    } 
} 
0
static void Main(string[] args) 
    { 
     string S = "p1, p2, p3, p4, p5, p6"; 

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

     PatternList.Add("p2"); 
     PatternList.Add("p5"); 
     PatternList.Add("p9"); 

     foreach (string s in PatternList.Where(x => !S.Contains(x))) 
     { 
      Console.WriteLine(s); 
     } 

     Console.ReadKey(); 
    }