2013-07-25 75 views
2

我有串,每個看起來像列表的字典:比較兩個字符串以不同的順序

"beginning|middle|middle2|end" 

現在我想要的是要做到這一點:

List<string> stringsWithPipes = new List<string>(); 
stringWithPipes.Add("beginning|middle|middle2|end"); 
... 

if(stringWithPipes.Contains("beginning|middle|middle2|end") 
{ 
return true; 
} 

問題是,我比較它的字符串的內容稍有不同,所以它最終變得更像:

if(stringWithPipes.Contains(beginning|middle2|middle||end) 
{ 
return true; 
} 

a顯然這最終是錯誤的。不過,我想考慮它是真實的,因爲它只有不同的順序。 我能做什麼?

+0

你爲什麼把它存儲爲'string'列表?爲什麼不是列表的字符串列表例如?如果不同順序的管道意味着不同的事情,'string'不是存儲組合的正確方法。 –

+2

拆分'|',刪除容器,並驗證兩個數組包含相同的項目 – Jonesopolis

回答

0

您需要拆分一個分隔符:

var searchString = "beginning|middle|middle2|end"; 
var searchList = searchString.Split('|'); 

var stringsWithPipes = new List<string>(); 
stringsWithPipes.Add("beginning|middle|middle2|end"); 
... 

return stringsWithPipes.Select(x => x.Split('|')).Any(x => Match(searchList,x)); 

然後你就可以實現匹配以多種方式

首先是必須包含所有的搜索詞,但也包括其他人。

bool Match(string[] search, string[] match) { 
    return search.All(x => match.Contains(x)); 
} 

或者必須是所有的搜索短語不能包含他人。

bool Match(string[] search, string[] match) { 
    return search.All(x => match.Contains(x)) && search.Length == match.Length; 
} 
1

試試這個::

if(stringWithPipes.Any(P => P.split('|') 
          .All(K => "beginning|middle2|middle|end".split('|') 
          .contains(K))) 

希望這將幫助!

+0

這看起來不錯,但它從未在列表中找到值。它是如此乾淨,但願爲此工作。 –

+0

有多個錯誤,所以這甚至不會編譯,並且它永遠不會找到你的LINQ錯誤的結果。 –

+0

這不起作用。如果'Intersect.Count()'返回0,這意味着沒有匹配的項目。你要檢查計數是否等於你比較的字符串中的項目數。在第二個注意點上,如果你發現自己在編寫'if(foo.Count()== 0)',你應該用'if(!foo.Any())'替換它。 'Count()'可能需要枚舉整個列表。任何()都只需要檢查一次。 –

2

您可以在|分割你的字符串,然後分割字符串進行比較,然後用Enumerable.ExceptEnumerable.Any

List<string> stringsWithPipes = new List<string>(); 
stringsWithPipes.Add("beginning|middle|middle2|end"); 
stringsWithPipes.Add("beginning|middle|middle3|end"); 
stringsWithPipes.Add("beginning|middle2|middle|end"); 

var array = stringsWithPipes.Select(r => r.Split('|')).ToArray(); 

string str = "beginning|middle2|middle|end"; 
var compareArray = str.Split('|'); 

foreach (var subArray in array) 
{ 
    if (!subArray.Except(compareArray).Any()) 
    { 
     //Exists 
     Console.WriteLine("Item exists"); 
     break; 
    } 
} 

這一定能夠優化一起,但上面是做的一種方式。

+0

我想你想否定'Except'。那就是'if(!subArray.Except(compareArray).Any())'。如果兩個集合包含相同的元素,則「Except」列表應該爲空。還是我困惑? –

+0

@JimMischel,不,你沒有困惑,你是完全正確的。在'Any'之前放置'!' – Habib

0

這應該有效。

List<string> stringsWithPipes = new List<string>(); 
stringsWithPipes.Add("beginning|middle|middle2|end"); 

string[] stringToVerifyWith = "beginning|middle2|middle||end".Split(new[] { '|' }, 
                   StringSplitOptions.RemoveEmptyEntries); 
if (stringsWithPipes.Any(s => !s.Split('|').Except(stringToVerifyWith).Any())) 
{ 
    return true; 
} 

拆分將刪除由雙打|創建的任何空條目。然後,如果使用Except方法刪除每個常見元素,則檢查剩下的部分。如果沒有剩下任何東西(! [...] .Any(),.Count() == 0也是有效的),它們都包含相同的元素。