Коллекция, которая позволяет только уникальные предметы in.NET?



есть ли в C# коллекция, которая не позволит вам добавлять в нее дубликаты элементов? Например, с глупым классом



public class Customer {
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }

public override int GetHashCode() {
return (FirstName + LastName + Address).GetHashCode();
}

public override bool Equals(object obj) {
Customer C = obj as Customer;
return C != null && String.Equals(this.FirstName, C.FirstName) && String.Equals(this.LastName, C.LastName) && String.Equals(this.Address, C.Address);
}
}


следующий код (очевидно) исключение:



Customer Adam = new Customer { Address = "A", FirstName = "Adam", LastName = "" };
Customer AdamDup = new Customer { Address = "A", FirstName = "Adam", LastName = "" };

Dictionary<Customer, bool> CustomerHash = new Dictionary<Customer, bool>();
CustomerHash.Add(Adam, true);
CustomerHash.Add(AdamDup, true);


но есть ли класс, который будет аналогично гарантировать уникальность, но без KeyValuePairs? Я думал HashSet<T> сделал бы это, но прочитав документы, кажется, что класс-это просто реализация набора (пойди разберись).

1581   6  

6 ответов:

HashSet<T> Это то, что вы ищете. От MSDN (Курсив мой):

The HashSet<T> класс обеспечивает высокопроизводительные операции набора. Набор-это коллекция, которая не содержит повторяющихся элементов, и чьи элементы не находятся в определенном порядке.

отметим, что HashSet<T>.Add(T item) метод возвращает a bool--true, если элемент был добавлен в коллекцию; false, если элемент был уже подарок.

Как насчет просто метода расширения на HashSet?

public static void AddOrThrow<T>(this HashSet<T> hash, T item)
{
    if (!hash.Add(item))
        throw new ValueExistingException();
}

С HashSet<T> страница на MSDN:

класс HashSet(Of T) обеспечивает высокопроизводительные операции набора. набор-это коллекция, которая не содержит повторяющихся элементов, и чьи элементы не находятся в определенном порядке.

(выделено мной)

вы можете попробовать HashSet<T>

Если все, что вам нужно, это обеспечить уникальность элементов, то HashSet-это то, что вам нужно.

Что вы имеете в виду, когда говорите "просто набор реализации"? Набор - это (по определению) набор уникальных элементов, который не сохраняет порядок элементов.

просто добавить мои 2 цента...

Если вам нужно ValueExistingException-throwing HashSet<T> вы также можете легко создать свою коллекцию:

public class ThrowingHashSet<T> : ICollection<T>
{
    private HashSet<T> innerHash = new HashSet<T>();

    public void Add(T item)
    {
        if (!innerHash.Add(item))
            throw new ValueExistingException();
    }

    public void Clear()
    {
        innerHash.Clear();
    }

    public bool Contains(T item)
    {
        return innerHash.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        innerHash.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get { return innerHash.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    public bool Remove(T item)
    {
        return innerHash.Remove(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return innerHash.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

это может быть полезно, например, если нужно во многих местах...

Comments

    Ничего не найдено.