HashSet with Index Access

◇◆丶佛笑我妖孽 提交于 2019-11-30 21:22:38

问题


I would need a data structure that

  1. Allows me to add/item to it
  2. Do not allow duplication
  3. access the collection via index

I am thinking about hashset, but HashSet doesn't have an index. What is the data structure that fulfills the above need?


回答1:


How about a collection derived from KeyedCollection<TKey, TItem>? This represents a collection of items where each key is derived from the item itself. By default it does not allow you to add duplicates (i.e. items with the same key). It allows lookup by key or 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;
        }
    }
}



回答2:


I think what you want is a Dictionary.




回答3:


does it work?

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();
        }
    }
}



回答4:


I think you need to develope your own List extension class. List can match your point 1 and 3, but to match point 2 you need to override Add methods.




回答5:


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();
            }
        }
    }
}


来源:https://stackoverflow.com/questions/7803676/hashset-with-index-access

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!