在C#中比较两个字符串数组

64

假设我们有五个字符串数组如下:

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会产生布尔值true?换句话说,所有元素都必须相等,而且数组大小必须相同吗?如果可能的话,再次不使用循环。


你可以使用string.Join来简化比较,也可以使用Linq来避免循环,但在底层仍然需要循环-你是因为某种原因而想要避免循环吗? - Charleh
看起来像是重复的问题,类似于 https://dev59.com/NXE85IYBdhLWcg3wKwOD 和 https://dev59.com/knRB5IYBdhLWcg3wH0SW。 - Atish Kumar Dipongkor
5个回答

112

你可以使用 Linq:

bool areEqual = a.SequenceEqual(b);

8
请注意,这种方法也会循环,只是因为你的要求是“不使用循环”。当然,如果没有循环是无法比较多个项的。还要注意,默认情况下它使用默认比较器,适用于值类型和.NET类型。对于自定义引用类型,您需要创建自定义的 IEqualityComparer<T> 用于 SequenceEqual,和/或重写 EqualsGetHashCode 方法。 - Tim Schmelter
1
@TimSchmelter:是的,我知道后台正在执行循环,但我想要一个漂亮而整洁的东西,没有任何错误的余地。 - Wes Field
18
当两个数组拥有完全相同的值,但顺序不同时,返回false。 - tdgtyugdyugdrugdr
当你需要构建一个Expression<Func<TIn,TOut>>时,“不使用循环”很方便。这就是我最终为Moq库中的Mock.Is<T>所做的事情。 - Nelson

25

1
还有一个好的答案。你能解释一下这个和Linq a.SequenceEqual(b)之间的区别吗? - Wes Field
2
同一件事 - 一个使用扩展方法语法,另一个显式地使用扩展方法。请查看扩展方法签名的详细信息:http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx - Charleh
3
没有区别。扩展方法只是静态类中的静态方法。所以你可以像处理普通的静态方法一样来处理它(这个回答),或者你可以像使用扩展方法一样使用它(Ahmed的回答)。 - Tim Schmelter

6

如果你想获取与另一个数组不同的数组数据,可以尝试使用 .Except 方法。

string[] array1 = { "aa", "bb", "cc" };
string[] array2 = { "aa" };

string[] DifferArray = array1.Except(array2).ToArray();

Output: {"bb","cc"}


string[] a = new string[] {"1","2","2"}; string[] b = new string[] {"1","2"};string[] DifferArray = a.Except(b).ToArray();DifferArray.Length; // 0 这是一个糟糕的情况。 - Медведев Александр
较长的列表需要放在前面,否则它将无法工作,例如 LongerList.Except(shorterList).ToArray(); - gl3yn

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))
                      );

返回两个匹配项(我想你可能可以扩展它,以排除已经匹配的项目)

谢谢,这次可能不会用到,但这是一个很棒的选项。 - Wes Field

-2
        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");
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接