有类似ISet的只读接口吗?

问题描述 投票:0回答:4

我想知道 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
,但要确保在定义之前没有内置的。

c#
4个回答
9
投票

8
投票

编辑于 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
    }
}

2
投票

它位于 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?


1
投票

在.Net 5及更高版本中,添加了

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();
© www.soinside.com 2019 - 2024. All rights reserved.