Есть ли только 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?