2013-06-20 12 views
39

これは基本的な質問かもしれませんが、私は答えを感謝します。2つの文字列を比較するC#

string[] a = {"The","Big", "Ant"}; 
string[] b = {"Big","Ant","Ran"}; 
string[] c = {"The","Big","Ant"}; 
string[] d = {"No","Ants","Here"}; 
string[] e = {"The", "Big", "Ant", "Ran", "Too", "Far"}; 

のみ、cは真のブール値を生じるようなC#でそれらをループすることなく、お互いにこれらの文字列を比較する方法があります:

は、我々のような5つの文字列配列を持っていると言いますか?つまり、すべての要素が等しくなければならず、配列は同じサイズでなければなりません。可能であれば、ループを使用せずに再び。前もって感謝します!

+0

string.Joinを使用して比較を簡単にすることができます.Lineqを使用してループから抜け出すこともできますが、あなたはまだループしています。理由はありません。 – Charleh

+0

は、http://stackoverflow.com/questions/2913287/comparing-arrays-using-linq-in-c-sharpおよびhttp://stackoverflow.com/questions/713341/comparing-arrays-in-cと重複しています。 -sharp –

答えて

63

あなたは、LINQを使用することができます:

bool areEqual = a.SequenceEqual(b); 
+7

@WesField:このメソッドはループしています。なぜなら、あなたの要件は「ループなし」_だったからです。もちろん、ループなしで複数の項目を比較することは不可能です。また、デフォルトでは値の型や.NETの型に対して機能するデフォルトの比較元が使用されます。カスタム参照型の場合、['SequenceEqual'](http://msdn.microsoft.com/en-us/library/bb342073.aspx)のためにカスタム' IEqualityComparer 'を作成するか、' 'Equals'と' GetHashCode'。 –

+0

@TimSchmelter:ええ、私はループがシーンの裏で実行されていることを認識して、私はちょうどムックのための部屋なしできちんとした、きれいなものを望んでいた。 –

+6

2つの配列の値がまったく同じであるが、順序が異なる場合はfalseを返します。 – tdgtyugdyugdrugdr

13

Enumerable.SequenceEqualを使用してみてください:

var equal = Enumerable.SequenceEqual(a, b); 
+1

また、良い答えです。これとLinq a.SequenceEqual(b)の違いについて説明できますか? –

+2

同じもの - 拡張メソッド構文を使用するものと、拡張メソッドを明示的に使用するものとがあります。詳細は、拡張メソッドsigを参照してください。http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx – Charleh

+2

@WesField:違いはありません。拡張メソッドは静的クラスの静的メソッドに過ぎません。したがって、通常の静的メソッド(この答え)として扱うことも、拡張メソッド(Ahmedの答え)として使用することもできます。 –

3

あなたが一度にそれらすべてを比較したい場合は、次の

string[] a = { "The", "Big", "Ant" }; 
string[] b = { "Big", "Ant", "Ran" }; 
string[] c = { "The", "Big", "Ant" }; 
string[] d = { "No", "Ants", "Here" }; 
string[] e = { "The", "Big", "Ant", "Ran", "Too", "Far" }; 

// Add the strings to an IEnumerable (just used List<T> here) 
var strings = new List<string[]> { a, b, c, d, e }; 

// Find all string arrays which match the sequence in a list of string arrays 
// that doesn't contain the original string array (by ref) 
var eq = strings.Where(toCheck => 
          strings.Where(x => x != toCheck) 
          .Any(y => y.SequenceEqual(toCheck)) 
        ); 

戻り値の両方が一致します(おそらく私が想定していたものを除外するためにこれを拡張することができます)

+0

ありがとうございます、おそらく今回は使用しませんが、それは気の利いたオプションです。 –

-1
 if (a.Length == d.Length) 
     { 
      var result = a.Except(d).ToArray(); 
      if (result.Count() == 0) 
      { 
       Console.WriteLine("OK"); 
      } 
      else 
      { 
       Console.WriteLine("NO"); 
      } 
     } 
     else 
     { 
      Console.WriteLine("NO"); 
     }