2010-01-24 37 views
1

我相當自豪地製作了我自己的這個LINQ的斷言:斷言都在一個屬於B和所有B屬於一個

bool assert1 = (from e in A 
       select B.Contains<T>(e, new TComparer())) 
       .All(x => x == true); 

bool assert2 = (from e in B 
       select A.Contains<T>(e, new TComparer())) 
       .All(x => x == true); 

Assert(assert1 && assert2); 

這將檢查A和B是由含有相等相同的元素,即A⊆B和B⊆A.

有沒有更漂亮的方法來做到這一點?

+3

http://stackoverflow.com/questions/1673347/linq-determine-if-two-sequences-contains-exactly-the-same-elements – 2010-01-24 23:59:36

回答

3

我這樣做:

IComparer<T> comparer = new TComparer(); 
bool equal = !A.Except(B, comparer).Any() && !B.Except(A, comparer).Any(); 
0

怎麼樣:

Assert.IsTrue(A.SequenceEqual(B, new SomeEqualityComparer())); 

按照評論我加入的序列進行排序澄清。無論如何,兩個序列都應該包含相同數量的元素。

OrderSequence(A).SequenceEqual(OrderSequence(B), new SomeEqualityComparer()); 

private static IEnumerable<StudentClass> OrderSequence(IEnumerable<StudentClass> left) 
{ 
    IComparer<StudentClass> comparer = new TComparer(); 
    return left.OrderBy(a => a, comparer); 
} 
+0

'Enumerable.SequenceEqual(其他)'如果它們相等是唯一真正作爲一個序列; (A.First())等於B.First()(根據SomeEqualityComparer),A.Skip(1).First()等於B.Skip (1).First()'(根據'SomeEqualityComparer')等。 – jason 2010-01-24 23:40:06

+0

欣賞努力,所以我正在恢復你的downvote。 – Martin 2010-01-25 09:41:47

2

您使用的斷言什麼庫?如果有機會它是NUnit,那麼只有AreEquivalent()方法的CollectionAssert類纔是這種類型的。

Linq對於集合轉換可以非常優雅,但是這是一種確切的任務,如果集合足夠大,它會帶來巨大的性能提升。你需要一個臨時的基於Hashtable的集合(HashSet或Dictionary)和專門的方法來快速完成它。

+0

好點。然而,在我的特例中,這些集合是在MbUnit中測試相等性的對象的成員(我相信== NUnit),所以上面的內容是從實體斷言中檢查幾個調用。在大多數情況下,這些集合<10,所以我會在這種情況下采取一個漂亮的解決方案。 – Martin 2010-01-25 09:32:53

相關問題