Sha256: 3a8f4e1a4dc40663000a36682bbc86b04065daf06d27281303d3f301c7d4274a

Contents?: true

Size: 1.93 KB

Versions: 115

Compression:

Stored size: 1.93 KB

Contents

using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class CustomSet<T> : IEnumerable<T>
{
    private readonly Dictionary<int, T> items = new Dictionary<int, T>();

    public CustomSet() : this(Enumerable.Empty<T>())
    {
    }

    public CustomSet(T value) : this(new[] { value })
    {
    }

    public CustomSet(IEnumerable<T> values)
    {
        foreach (var value in values.Where(value => !items.ContainsKey(value.GetHashCode())))
        {
            items.Add(value.GetHashCode(), value);
        }
    }

    public CustomSet<T> Insert(T value)
    {
        var newValues = items.Values.ToList();
        newValues.Add(value);

        return new CustomSet<T>(newValues);
    }

    public bool IsEmpty() => items.Count == 0;

    public bool Contains(T value) => items.ContainsKey(value.GetHashCode());

    public bool IsSubsetOf(CustomSet<T> right) => items.Keys.All(key => right.items.ContainsKey(key));

    public bool IsDisjointFrom(CustomSet<T> right) => !items.Keys.Any(key => right.items.ContainsKey(key));

    public CustomSet<T> Intersection(CustomSet<T> right)
    {
        var intersectionKeys = items.Keys.Intersect(right.items.Keys);
        return new CustomSet<T>(GetValuesFromKeys(intersectionKeys));
    }

    public CustomSet<T> Difference(CustomSet<T> right)
    {
        var differenceKeys = items.Keys.Except(right.items.Keys);
        return new CustomSet<T>(GetValuesFromKeys(differenceKeys));
    }

    public CustomSet<T> Union(CustomSet<T> right)
    {
        var values = items.Values.ToList();
        values.AddRange(right.items.Values);

        return new CustomSet<T>(values);
    }

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

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    private IEnumerable<T> GetValuesFromKeys(IEnumerable<int> keys) => keys.Select(key => items[key]);
}

Version data entries

115 entries across 115 versions & 1 rubygems

Version Path
trackler-2.0.8.14 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.13 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.12 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.11 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.10 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.9 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.8 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.7 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.6 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.5 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.4 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.3 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.2 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.8.1 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.7.0 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.6.44 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.6.43 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.6.42 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.6.41 tracks/csharp/exercises/custom-set/Example.cs
trackler-2.0.6.40 tracks/csharp/exercises/custom-set/Example.cs