2

Dictionary を使用して、標準の HashSet として機能する独自の HashSet を作成しています。XNA XBox の C# は HashSets をサポートしていないため、これを行っています。

このコードは、私が見つけた例のコードに基づいています。いくつかの問題を修正するために例を編集しましたが、それでもコンパイルできません。

public class HashSet2<T> : ICollection<T>
{
    private Dictionary<T, Int16> dict;

    // code has been edited out of this example
    // see further on in the question for the full class

    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }

    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        return dict.GetEnumerator();
    }
}

.

'HashSet2<T>' does not implement interface member
'System.Collections.IEnumerable.GetEnumerator()'.
'HashSet2<T>.GetEnumerator()' cannot implement
'System.Collections.IEnumerable.GetEnumerator()'
because it does not have the matching return type of
'System.Collections.IEnumerator'

また、予期しない方法で動作や実装が逸脱している場合、標準の HashSet のようになるように修正するための情報にも感謝します。

続き:stackoverflow.com/questions/9966336/c-sharp-xna-xbox-hashset-and-tuple

クラスの最新バージョン:

public class HashSet2<T> : ICollection<T>
{
    private Dictionary<T, Int16> dict;
    // Dictionary<T, bool>

    public HashSet2()
    {
        dict = new Dictionary<T, short>();
    }

    public HashSet2(HashSet2<T> from)
    {
        dict = new Dictionary<T, short>();
        foreach (T n in from)
            dict.Add(n, 0);
    }

    public void Add(T item)
    {
        // The key of the dictionary is used but not the value.
        dict.Add(item, 0);
    }

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

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

    public void CopyTo(
        T[] array,
        int arrayIndex)
    {
        throw new NotImplementedException();
    }

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

    public System.Collections.IEnumerator GetEnumerator()
    {
        return ((System.Collections.IEnumerable)
            dict.Keys).GetEnumerator();
    }

    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        return ((IEnumerable<T>)
            dict.Keys).GetEnumerator();
    }

    public int Count
    {
        get {return dict.Keys.Count;}
    }

    public bool IsReadOnly
    {
        get {return false;}
    }
}
4

4 に答える 4

1

辞書ではなく、キーを列挙する必要があります。これを試して:

public IEnumerator GetEnumerator()
{
    return ((IEnumerable)dict.Keys).GetEnumerator();
}

IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
    return ((IEnumerable<T>)dict.Keys).GetEnumerator();
}
于 2012-04-20T14:12:04.360 に答える
1

ポイントは、HashSet の returnGetEnumerator列挙子が型のキーTを列挙する一方で、ディクショナリのGetEnumeratorreturn 列挙子が KeyValue オブジェクトを列挙することです。

アップデート

以下に変更します。

public IEnumerator GetEnumerator()
{
    dict.Keys.GetEnumerator();
}

IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
    return dict.Keys.GetEnumerator();
}
于 2012-04-20T13:21:12.290 に答える
0

モノのを使用するだけですHashSet<T>#ifにいくつかの小さな変更を加えるか、いくつかのインターフェイス/属性を削除する必要があるかもしれませんが、それは.netで機能します。

パーミッシブなMITX11ライセンスを使用しています。https://github.com/mono/mono/blob/master/mcs/class/System.Core/System.Collections.Generic/HashSet.cs

于 2012-04-20T13:22:38.977 に答える
0

ソースを見てみると、 GetEnumerator のすべての実装は代わりに/オブジェクトをDictionary<TKey, TValue>返します(これが必要です)。良いニュースは、 がとインターフェイスの両方を実装しているため、これらの型に安全にキャストできることです。KeyCollection.EnumeratorValueCollection.EnumeratorIEnumerator<T>Key/ValueCollation.EnumeratorSystem.Collection.IEnumeratorIEnumerator<T>

代わりにこれを試してください:

public IEnumerator GetEnumerator()
{
    return (IEnumerator)dict.Keys.GetEnumerator();
}

IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
    return (IEnumerator<T>)dict.Keys.GetEnumerator();
}
于 2012-04-20T14:40:50.017 に答える