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;
}
4

7 回答 7

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));
于 2012-09-27T21:38:14.130 回答
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 代码之前检查长度(在长度不同的情况下避免两个 OrderBy)。此外,为了节省内存,您可以在拆分数组上使用就地排序,即:

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 单线。

于 2012-09-27T21:36:51.120 回答
0

首先,您需要拆分字符串以获取数组并对它们进行排序

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

现在您可以使用“SequenceEquals”来比较 Enumerables

var result = ary1.SequenceEquals(ary2);

SeqenceEquals 比较位置和值,因此如果您还想检测位置变化,请移除 OrderBy。

于 2012-09-27T21:42:10.167 回答
0

尝试

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

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

如果要比较数组以查看它们是否完全相同,则需要先执行上述操作,然后很可能将数组按 AZ 顺序排序,然后比较每个元素

注意:这是不必要的...

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

......你可以这样做,它更优雅......

return (_exists.All(s => _check.Contains(s)));
于 2012-09-27T21:33:24.653 回答
0

如果您只想计算字符串,请尝试:

bool sameAmountOfStrings = _exists.Count(c => c.Equals(',')) == _check.Count(c => c.Equals(,));
于 2012-09-27T21:39:40.883 回答
0

如果你想查看用逗号分隔的子字符串的数量是否相同,那么使用这个。

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

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

于 2012-09-27T21:36:51.347 回答
0

将字符串拆分为两个列表,然后使用 Linq to Objects 进行比较

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
}
}
于 2012-09-27T21:36:52.013 回答