【问题标题】:Is there a readonly ISet-like interface?是否有类似 ISet 的只读接口?
【发布时间】:2014-07-02 18:13:59
【问题描述】:

我想知道是否有任何类似 set 的只读接口在 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,但要先确保没有内置的。

【问题讨论】:

  • 你的意思是ReadOnlyCollection<T>还是readonly关键字
  • readonly 关键字在这里有点用处不是吗?
  • 如果您只需要Contains 方法,您可以使用Func&lt;T, bool&gt;
  • 同意,但是当您不知道 X 是什么时建议使用只读关键字...?
  • 遗憾的是,他们没有创建IReadOnlySet&lt;T&gt;,如果他们这样做了,它可能会包含您抱怨必须实施的绝大多数方法。所以创建一个IContainsCollection&lt;T&gt; : ICollection&lt;T&gt; { Contains(T); },或者部分实现ISet&lt;T&gt;,其余部分使用NotImplementedExceptions,或者创建IContains&lt;T&gt; { Contains(T); }等等。你想做什么?如果您回答这个问题,我们可以明智地提出建议

标签: c#


【解决方案1】:

2020 年 9 月 17 日编辑:.NET 5.0 现在提供新接口 IReadOnlySet<T>


不,C# 中没有IReadOnlySet&lt;T&gt; 接口。根据您描述的需求,我认为您应该创建自己的IContains&lt;T&gt; 接口。

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

请注意,这不能添加到现有集合中,例如 List&lt;T&gt;HashSet&lt;T&gt;,并且不包含任何其他类似集合的操作,例如 Count 或枚举。你可以像这样使用它:

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

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      它位于 Microsoft.SqlServer.Management.Sdk 命名空间中。见:

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

      我不知道它为什么存在,而不是与 .NET 本身中的其他 IReadOnlyYadaYada 接口一起存在。大概是有些乱七八糟的。并且可能,对冲突的恐惧是他们没有将其放入 .NET 本身的原因。真可惜。

      另外,请参阅此问题:Why does List implement IReadOnlyList in .NET 4.5?

      【讨论】:

      • 晚了,但现在有解决方案。它是一个名为 System.Collections.Immutable 的 nuget 包
      • @MohsinSyed 请考虑在此处回答问题并添加类型名称等完整详细信息。
      猜你喜欢
      • 2012-06-20
      • 1970-01-01
      • 2016-01-13
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多