Tôi có hai mảng. Ví dụ:Kiểm tra tính bình đẳng của các mảng trong C#
int[] Array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] Array2 = new[] {9, 1, 4, 5, 2, 3, 6, 7, 8};
Cách tốt nhất để xác định xem chúng có cùng yếu tố không?
Tôi có hai mảng. Ví dụ:Kiểm tra tính bình đẳng của các mảng trong C#
int[] Array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] Array2 = new[] {9, 1, 4, 5, 2, 3, 6, 7, 8};
Cách tốt nhất để xác định xem chúng có cùng yếu tố không?
Bằng cách sử dụng LINQ bạn có thể thực hiện nó expressively và performant:
var q = from a in ar1
join b in ar2 on a equals b
select a;
bool equals = ar1.Length == ar2.Length && q.Count() == ar1.Length;
Cảm ơn đoạn mã này. Làm việc như một nét duyên dáng cho kịch bản của tôi !! – SudheerKovalam
Tôi thấy điều này chậm hơn nhiều so với việc chỉ thực hiện vòng lặp và so sánh từng mục.Vòng lặp có thể không đẹp, nhưng nhanh hơn nhiều. –
Tôi không chắc chắn về điều đó. Theo như tôi biết LINQ-to-Objects tạo ra các bảng băm trung gian để lặp qua các phép nối nhanh hơn nhiều so với một vòng lặp thẳng. –
Tôi đã tìm thấy giải pháp chi tiết here là một cách rất rõ ràng, mặc dù một chút tiết cho một số người.
Điều tốt nhất là nó hoạt động cho các IEnumerables khác.
Liên kết đó mô tả SequenceEqual (trong .NET 3.5) và sẽ trả về false trên dữ liệu này vì chúng theo thứ tự khác. –
Để tham khảo, nó sẽ là (sử dụng các phương thức mở rộng) bool areEqual = array1.SequenceEqual (array2); –
Giá trị luôn luôn là duy nhất? Nếu vậy, làm thế nào về (sau khi kiểm tra chiều dài bằng nhau):
var set = new HashSet<int>(array1);
bool allThere = array2.All(set.Contains);
marc, tôi cũng có thể so sánh thông qua 'IStructuralEquatable' (bộ dữ liệu và mảng). Vì vậy, khi nào tôi nên chọn 'IStructuralEquatable' so với 'SequenceEqual'? –
Không phải 'set.SetEquals (array2)' có thể đọc được không? – nawfal
var shared = arr1.Intersect(arr2);
bool equals = arr1.Length == arr2.Length && shared.Count() == arr1.Length;
Bạn cũng có thể sử dụng SequenceEqual
, với điều kiện các đối tượng IEnumerable được sắp xếp trước.
int[] a1 = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] a2 = new[] { 9, 1, 4, 5, 2, 3, 6, 7, 8 };
bool equals = a1.OrderBy(a => a).SequenceEqual(a2.OrderBy(a => a));
yep, sắp xếp/sắp xếp rồi SequenceEqual –
Sử dụng các phương pháp mở rộng (tính năng mới trong 3.0). Nếu chiều dài của Intersection của hai mảng bằng với Liên minh của chúng thì các mảng là như nhau.
bool equals = arrayA.Intersect(arrayB).Count() == arrayA.Union(arrayB).Count()
gọn gàng.
Đối với phương pháp hiệu quả nhất (Reflectored từ mã Microsoft), xem stack Overflow câu hỏi Comparing two collections for equality irrespective of the order of items in them.
Framework 4.0 giới thiệu giao diện IStructuralEquatable giúp để so sánh các loại như mảng hoặc các bộ:
class Program
{
static void Main()
{
int[] array1 = { 1, 2, 3 };
int[] array2 = { 1, 2, 3 };
IStructuralEquatable structuralEquator = array1;
Console.WriteLine(array1.Equals(array2)); // False
Console.WriteLine(structuralEquator.Equals(array2, EqualityComparer<int>.Default)); // True
// string arrays
string[] a1 = "a b c d e f g".Split();
string[] a2 = "A B C D E F G".Split();
IStructuralEquatable structuralEquator1 = a1;
bool areEqual = structuralEquator1.Equals(a2, StringComparer.InvariantCultureIgnoreCase);
Console.WriteLine("Arrays of strings are equal:"+ areEqual);
//tuples
var firstTuple = Tuple.Create(1, "aaaaa");
var secondTuple = Tuple.Create(1, "AAAAA");
IStructuralEquatable structuralEquator2 = firstTuple;
bool areTuplesEqual = structuralEquator2.Equals(secondTuple, StringComparer.InvariantCultureIgnoreCase);
Console.WriteLine("Are tuples equal:" + areTuplesEqual);
IStructuralComparable sc1 = firstTuple;
int comparisonResult = sc1.CompareTo(secondTuple, StringComparer.InvariantCultureIgnoreCase);
Console.WriteLine("Tuples comarison result:" + comparisonResult);//0
}
}
này sẽ kiểm tra rằng mỗi mảng chứa các giá trị tương tự theo thứ tự.
int[] ar1 = { 1, 1, 5, 2, 4, 6, 4 };
int[] ar2 = { 1, 1, 5, 2, 4, 6, 4 };
var query = ar1.Where((b, i) => b == ar2[i]);
Assert.AreEqual(ar1.Length, query.Count());
public static bool ValueEquals(Array array1, Array array2)
{
if(array1 == null && array2 == null)
{
return true;
}
if((array1 == null) || (array2 == null))
{
return false;
}
if(array1.Length != array2.Length)
{
return false;
}
if(array1.Equals(array2))
{
return true;
}
else
{
for (int Index = 0; Index < array1.Length; Index++)
{
if(!Equals(array1.GetValue(Index), array2.GetValue(Index)))
{
return false;
}
}
}
return true;
}
Bạn có thực sự đối phó với những con số hay là chỉ dành riêng cho ví dụ? – mmcdole
Thay vào đó, bạn có thể sử dụng Danh sách (đã có phương pháp Chứa) không? –
@ed nó không phải là về một chứa đơn giản, nhưng xác định cả hai mảng có cùng một yếu tố, đọc lại câu hỏi và xem câu trả lời :) – eglasius