2010-11-08 16 views
6

.NET BCL'nin değişmez bir Set türü var mı? Ben C# fonksiyonel lehçesinde programlama olduğum ve aramaların aşağıdaki diziyi gerektirecektir.NET'te bağımsız olarak ayarlanmış set

new Set.UnionWith(A).UnionWith(B).UnionWith(C) 

Ama bulabileceğimiz en iyi HashSet.UnionWith olduğunu, böyle bir şey yapmak istiyorum:

HashSet composite = new HashSet(); 
composite.UnionWith(A); 
composite.UnionWith(B); 
composite.UnionWith(C); 

Bu Kullanımı oldukça iyi bir şekilde opaktır, bu da optimizasyonu ve anlamasını zorlaştırır. Özel bir fonksiyonel set yazmadan bunu yapmanın daha iyi bir yolu var mı?

+0

Bu aynı zamanda may ilişkili http: // stackoverflow.com/sorular/927181/değişmez-koleksiyonları – R0MANARMY

cevap

4

Bu cevap bir süre önce yazılmış ve o zamandan beri değişmez koleksiyon kümesidir System.Collections.Immutable ad alanında tanıtılmıştır

Güncelleme.

Orijinal cevap

Bunun için kendi yöntemini dönebilirsiniz

:

public static class HashSetExtensions { 
    public static HashSet<T> Union<T>(this HashSet<T> self, HashSet<T> other) { 
    var set = new HashSet<T>(self); // don't change the original set 
    set.UnionWith(other); 
    return set; 
    } 
} 

böyle kullanın:

var composite = A.Union(B).Union(C); 

Ayrıca LINQ's Union kullanabilirsiniz, ancak almak Bir küme, sonucu yapıcısına iletmeniz gerekir:

Ancak, HashSet'un kendisi değiştirilebilir. F#'s immutable set'u kullanmayı deneyebilirsiniz. Concat kullanılarak ErikE yorumlarına belirtildiği gibi Ayrıca

, aynı sonucu verir ve muhtemelen daha iyi gerçekleştirir:

var composite = new HashSet<string>(A.Concat(B).Concat(C)); 
+2

Bu kod derin değişmezlik garanti etmez. Set yapısını değiştirirseniz (örneğin sette bulunanlar), orijinal set yapısı bozulmadan kalır. Ancak, sonuç kümesindeki öğeleri değiştirirseniz, orijinal kümedeki öğeler de değişir. –

+2

Derin değişmezlik sadece C# 'de garanti edilir, eğer set içindeki öğeler değişmezse. Set, kendi başına uygulayamaz. Ayrıca, 'HashSet' değişken bir kümedir, belki BCL'nin dışındaki diğer sınıfları aramalısınız. –

+2

@ MerlynMorgan-Graham: Bazı sınıf-nesne tipinin değişmez bir setinin durumu, bu şekilde atıfta bulunulan nesnelerin kimliklerinin toplanmasıdır. Tamper-belirgin kağıt üzerine basılmış beş otomobilin Araç Kimlik Numaralarının bir listesi varsa, her zaman aynı beş arabaya işaret eder. Liste arabalar nerede hakkında bir şey söyleyerek kabul edilmemelidir, ne olduklarını renk, onlar vb tahrik ettik otomobillerin bu özelliklerin Tüm değiştirilebilir kaç mil. Bununla birlikte, bir aracın birçok özelliklerinin değişebileceği gerçeği, arabaların listesini daha az değişmez hale getirmiyor. – supercat

9

yeni ImmutableCollections var:

  • ImmutableStack<T>
  • ImmutableQueue<T>
  • ImmutableList<T>
  • ImmutableHashSet<T>
  • ImmutableSortedDictionary<K, V>
ImmutableSortedSet<T>
  • ImmutableDictionary<K, V>
  • bu testten geçerse sendika hakkında

    diğer bilgiler here

    :

    [Test] 
    public void UnionTest() 
    { 
        var a = ImmutableHashSet.Create("A"); 
        var b = ImmutableHashSet.Create("B"); 
        var c = ImmutableHashSet.Create("C"); 
        var d = a.Union(b).Union(c); 
        Assert.IsTrue(ImmutableHashSet.Create("A", "B", "C").SetEquals(d)); 
    } 
    
    İlgili konular