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

これらは文字列の配列ではなく、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コードを呼び出す前に長さをチェックすることができます(長さが異なる場合は2つの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

試す

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

カンマで区切られた部分文字列の数が同じかどうかを確認する場合は、これを使用します。

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

これは私があなたの質問から理解したことです。

于 2012-09-27T21:36:51.347 に答える
0

文字列を分割して2つのリストを作成し、後でLinqtoObjectsを使用してそれらを比較します

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 に答える
0

文字列をカウントしたいだけの場合は、次を試してください。

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

まず、配列を取得して並べ替えるために文字列を分割する必要があります

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

これで、「SequenceEquals」を使用して列挙型を比較できます

var result = ary1.SequenceEquals(ary2);

SeqenceEqualsは位置と値を比較するため、位置の変化も検出する場合は、OrderByを削除します。

于 2012-09-27T21:42:10.167 に答える