2011-05-16 81 views
5

主要問題:
好球員,這裏的情況,讓我們考慮2個字符串數組:如何檢查是否在一個字符串數組包含字符串從另一個陣列

string foo = { "Roses are #FF0000" , "Violets are #0000FF", "Paint it #000000"} 
string bar = { "Guns", "Roses", "Violets"} 

什麼是「最少的代碼線「的方式來檢索包含字符串的foo中的字符串?
(即,在這種情況下,foo的2個第一要素)

我當然希望避免「手動」做所有的邏輯,我可以肯定的LINQ與交叉功能更有效,但我不知道如何使用它來執行這個精確的任務。

分決賽:
1 -如果什麼富包含了含有棒的不止一個元素串,

string foo = { "Roses are #FF0000" , "Violets are #0000FF", "Paint it #000000"} 
string bar = { "Roses", "Violets", "are"} 

而且我想以避免重複?

2 -如果我有2個「bar」數組,我想檢查一個foo數組該怎麼辦?
合併bar1和bar2或者先用bar1執行過濾器,然後用bar2執行過濾器效率更高嗎?


感謝名單,有樂趣回答:-)

回答

6

LINQ效果很好,是的:

var mixed = foo.Where(x => bar.Any(y => x.Contains(y)); 

請注意,您仍然只能看到foo每個元素一次,如果在所有。

如果您有多個bar陣列,您可以使用:

var mixed = foo.Where(x => bar1.Concat(bar2) 
           .Any(y => x.Contains(y)); 
1
string[] foo = new string[] { "Roses are #FF0000", "Violets are #0000FF", "Paint it #000000" }; 
string[] bar = new string[] { "Guns", "Roses", "Violets" }; 

var matches = from f in foo 
       where bar.Any(b => f.Contains(b)) 
       select f; 

foreach (var m in matches) 
    Console.WriteLine(m); 
+0

燁這工作太(這是我一直在使用幾年前的語法),雖然它的速度更快沒有select和from語句。感謝名單。 – 2011-05-16 13:12:58

+0

@Mika,我更喜歡查詢語法,特別是當查詢長度大於此值時。我覺得它更可讀。 – 2011-05-16 14:32:00

2

假設在你的描述中string是你的老師的錯字,

var result=foo.Where(w=>bar.Any(iw=>w.Contains(iw))); 

我不知道什麼複製您的意思是,只會在foo中顯示元素,無論它出現在bar中的次數如何。

至於第二個決勝局,所有你需要做的就是這樣的事情:

var result=foo.Where(w=>bar1.Any(iw=>w.Contains(iw))||bar2.Any(iw=>w.Contains(iw))); 
+0

ThanX它工作正常,但我不得不將'iw => iw.Contains(w)'轉換爲'iw => w.Contains(wi)'使其工作。另外,我改變了||到&&(我選擇了你最後的語法命題,因爲它對我來說是有意義的,形成一個代碼閱讀的視角 – 2011-05-16 13:09:31

+0

||意味着它們中的任何一個,&&意味着它們兩個,我假定你是指前者。 – Blindy 2011-05-16 13:30:56

相關問題