HashSet с индексным доступом - PullRequest
1 голос
/ 18 октября 2011

Мне нужна структура данных, которая

  1. Позволяет добавить / элемент к ней
  2. Не разрешать дублирование
  3. доступ к коллекции через индекс

Я думаю о хэш-наборе, но HashSet не имеет индекса .Какая структура данных удовлетворяет вышеуказанным потребностям?

Ответы [ 5 ]

3 голосов
/ 18 октября 2011

Как насчет коллекции, полученной из KeyedCollection ? Это представляет собой набор элементов, каждый ключ которого получен из самого элемента. По умолчанию он не позволяет добавлять дубликаты (то есть элементы с одинаковым ключом). Позволяет искать по ключу или index.

internal class Program
{
    private static void Main(string[] args)
    {
        TestItemCollection items = new TestItemCollection();
        items.Add(new TestItem("a"));
        items.Add(new TestItem("a")); // throws ArgumentException -- duplicate key

        TestItem a = items["a"];
        a = items[0];
    }

    private sealed class TestItem
    {
        public TestItem(string value)
        {
            this.Value = value;
        }

        public string Value { get; private set; }
    }

    private sealed class TestItemCollection : KeyedCollection<string, TestItem>
    {
        public TestItemCollection()
        {
        }

        protected override string GetKeyForItem(TestItem item)
        {
            return item.Value;
        }
    }
}
1 голос
/ 18 октября 2011

это работает?

class MyHashSet<T> : HashSet<T>
{
    public T this[int index]
    {
        get
        {
            int i = 0;
            foreach (T t in this)
            {
                if (i == index)
                    return t;
                i++;
            }
            throw new IndexOutOfRangeException();
        }
    }
}
0 голосов
/ 04 июля 2014
You can do it by extending the HashSet, meat of it to see if it contains the element, and thats O(1), reaturn that  element, so no harm done in that case. Here is the derived one:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;

namespace Tester
{
    // Summary:
    //     Represents a set of values.
    //
    // Type parameters:
    //   T:
    //     The type of elements in the hash set.
    [Serializable]
    public class HashSetExt<T> : HashSet<T>
    {
        // Summary:
        //     Initializes a new instance of the System.Collections.Generic.HashSetExt<T> class
        //     that is empty and uses the default equality comparer for the set type.
        public HashSetExt() : base() { }

        public HashSetExt(IEnumerable<T> collection) : base(collection) { }
        public HashSetExt(IEqualityComparer<T> comparer) : base(comparer) { }

        public HashSetExt(IEnumerable<T> collection, IEqualityComparer<T> comparer) : base(collection, comparer) { }

        protected HashSetExt(SerializationInfo info, StreamingContext context) : base(info, context) { }

        public T this[T item]
        {
            get
            {
                if (this.Contains(item))
                {
                    return item;
                }
                throw new KeyNotFoundException();
            }
        }
    }
}
0 голосов
/ 18 октября 2011

Я думаю, вам нужно разработать собственный класс расширения List. List может соответствовать вашим точкам 1 и 3, но для совпадения с точкой 2 вам необходимо переопределить Add методы.

0 голосов
/ 18 октября 2011

Я думаю, что вам нужен словарь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...