2012-09-27 289 views
1

编辑:的顺序可能会改变,你可以在下面的例子中看到,这两个字符串具有相同的名称,但不同的顺序....如何检查是否字符串包含字符串数组字符串

你将如何检查后看看两个字符串数组是否匹配?

下面的代码返回true,但在现实中它应该返回false,因为我在_check

我试图做到的,是额外的字符串数组来检查,看看是否两个字符串数组有相同数量的字符串。

string _exists = "Adults,Men,Women,Boys"; 
string _check = "Men,Women,Boys,Adults,fail"; 

if (_exists.All(s => _check.Contains(s))) //tried Equal 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 
+0

_字符串的数量?我假设你的意思是_same strings_而不是?!如果顺序无关紧要,那么它是否会出现字符串发生的频率(第一个包含“Men”两次,第二个包含它只是一次?)这个问题很重要吗?字符串是否可能包含逗号? –

+0

@Tim,相同数量的字符串表示如果_exists有5个字符串(一,二,三....),那么_check也应该有5个字符串(两个,一个,三个......)查看LB答案,我想我得到我想要的东西 –

回答

3
string _exists = "Adults,Men,Women,Boys"; 
string _check = "Men,Women,Boys,Adults,fail"; 

bool b = _exists.Split(',').OrderBy(s=>s) 
       .SequenceEqual(_check.Split(',').OrderBy(s=>s)); 
+0

简单而优雅!+ 1 – series0ne

+0

非常好,顺序通过帮助清除由重复的字符串标记导致的含糊不清。 –

+0

1+这是我一直在寻找:) –

0

尝试

return (_exists.Length == _check.Length); 

这将检查字符串数组的长度相同,但不一定是相同的值。

如果要比较的阵列,看看他们是否有你需要做上述第一,那么最有可能的排列为AZ顺序排序,比较每个元素

注完全一样:这是不必要的...

if (_exists.All(s => _check.Contains(s))) //tried Equal 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

...你可以如果你想看看用逗号分隔子的数目为t做到这一点,它更优雅......

return (_exists.All(s => _check.Contains(s))); 
0

他一样,然后用这个。

public bool StringsHaveSameNumberOfSubstring(string _exists, string _check) 
{ 
    return (_exists.Split(',').Length == _check.Split(',').Length); 
} 

这是我从你的问题中了解到的。

2

那些不是字符串数组,而是两个字符串。
因此,您实际上需要在检查内容相等性之前将它们拆分为子字符串。

你可以这样做:

string _exists = "Adults,Men,Women,Boys"; 
string _check = "Men,Women,Boys,Adults,fail"; 

var checks = _check.Split(','); 
var exists = _exists.Split(','); 

bool stringsEqual = checks.OrderBy(x => x).SequenceEqual(exists.OrderBy(x => x)); 

要加快有点某些特殊情况下,你可以调用LINQ代码(避免在不同长度的情况下,两个排序依据的)之前检查的长度。此外,为了节省内存,你可以使用就地排序上劈叉阵列,即:

string _exists = "Adults,Men,Women,Boys"; 
string _check = "Men,Women,Boys,Adults,fail"; 

var checks = _check.Split(','); 
var exists = _exists.Split(','); 

if(checks.Length != exists.Length) 
    return false; 

Array.Sort(checks); 
Array.Sort(exists); 

if (checks.SequenceEqual(exists)) 
    return true; 
return false; 

显然,这些优化是唯一的,如果你的字符串很长有用的,否则,你可以简单地用LINQ去单衬垫。

0

分割字符串,使两个列表,后来他们使用LINQ to对象

string _exists = "Adults,Men,Women,Boys"; 
string _check = "Men,Women,Boys,Adults,fail"; 


List<string> exists = new List<string>(_exists.Split(new char[] { ',' })); 
List<string> check = new List<string>(_check.Split(new char[] { ',' })); 

foreach(string toCheck in check){ 
if(exists.Contains(toCheck)){ 
    //do things 
} 
} 
0

比较,如果你只是想数字符串尝试:

bool sameAmountOfStrings = _exists.Count(c => c.Equals(',')) == _check.Count(c => c.Equals(,)); 
0

首先你需要分割字符串以获取数组并排序它们

var ary1 = _existing.Split(',').Trim().OrderBy(x => x); 
var ary2 = _check.Split(',').Trim().OrderBy(x => x); 

现在你可以使用“SequenceEquals的”比较可枚举

var result = ary1.SequenceEquals(ary2); 

SeqenceEquals比较的地位和价值,所以如果你想检测位置的变化,以及,remoce的排序依据。

相关问题