我想知道 C# 中是否有任何类似集合的只读接口声明
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
,但要确保在定义之前没有内置的。
编辑于 2020 年 9 月 17 日:.NET 5.0 现在提供新界面IReadOnlySet
不,C# 中没有
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
}
}
它位于 Microsoft.SqlServer.Management.Sdk 命名空间中。 参见:
https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.sdk.sfc.ireadonlyset.aspx
我不知道为什么它在那里,而不是与 .NET 本身中的其余 IReadOnlyYadaYada<> 接口一起。 可能出了点问题。 也许,担心冲突是他们没有将其放入 .NET 本身的原因。 真是可惜。
另外,请参阅这个问题:为什么 List 在 .NET 4.5 中实现 IReadOnlyList?
IReadonlySet<T>
。在这个版本的.Net中,微软已经开始支持Immutality。 System.Collections.Generic Namespace
中有几个类和接口来支持不可变的功能。例如,您可以使用 ImmutableList<T>
,这是我的最爱之一。
通过以下代码片段,您可以将
IEnumerable<T>
转换为 IReadOnlySet<T>
:
public static IReadOnlySet<T> ToReadOnlySet<T>([DisallowNull] this IEnumerable<T> items) => ImmutableList.CreateRange(items).ToHashSet();