Есть ли только ISet-подобный интерфейс?

Мне интересно, есть ли какой-либо set-подобный интерфейс для чтения, который объявляет метод Contains в С#. Я не хочу просто реализовывать интерфейс ISet, потому что у него слишком много ненужных методов.

Реализация моей идеи будет выглядеть как:

public class PositiveInt : IReadOnlySet<Int32>
{
   public bool Contains(Int32 n){
      return n > 0;
   }
}

public class CraEmployeeNames:IReadOnlySet<String>
{
   public bool Contains(String n){
      return !String.IsNullOrWhiteSpace(n) && n.StartsWith("Cra");
   }
} 

Я могу определить свой собственный IReadOnlySet, но хочу убедиться, что у него нет встроенного.

Ответы

Ответ 1

Нет, в С# нет интерфейса IReadOnlySet<T>. Основываясь на потребностях, которые вы описали, я думаю, вы должны создать свой собственный интерфейс IContains<T>.

public interface IContains<T>
{
    bool Contains(T item);
}

Обратите внимание, что это нельзя добавить к существующим коллекциям, таким как List<T> или HashSet<T>, и не содержит никаких других подобных операций, таких как Count или перечисление. Вы можете использовать его как:

public void TestContains<T>(IContains<T> container, T item)
{
    if (container.Contains(item))
    {
        //something
    }
    else
    {
        //something else
    }
}

Ответ 2

Он находится в пространстве имен Microsoft.SqlServer.Management.Sdk. См:

https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.sdk.sfc.ireadonlyset.aspx

Я не знаю, почему он существует, а не с остальными интерфейсами IReadOnlyYadaYada < > в самой .NET. Возможно, какой-то snafu. И, вероятно, страх перед столкновением - причина, по которой они не поместили его в сам .NET. Какой позор.

Также см. этот вопрос: Почему List реализует IReadOnlyList в .NET 4.5?