2013-06-20 217 views
39

好吧,所以这可能是一个基本问题,但我会很感激答案。C#比较两个字符串数组

说我们有5个字符串数组这样:

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#这样通过他们循环,只有A和C会产生布尔真比较法?换句话说,所有元素必须相同,并且数组必须具有相同的大小?同样,如果可能的话,不要使用循环。提前致谢!

+0

你可以简化使用string.Join的比较,你可以摆脱使用Linq的循环,但在引擎盖下仍然循环 - 你是否试图做到没有循环的原因? – 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

当两个数组的值完全相同时,返回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"); 
     }