List.Contains 在比较方面完全等同于 List.IndexOf 吗?

2024-03-10

MSDN 描述列表.包含() http://msdn.microsoft.com/en-us/library/bhkz42b3%28v=vs.110%29.aspx says

此方法通过使用默认相等比较器来确定相等性,该比较器由 T(列表中的值的类型)的 IEquatable.Equals 方法的对象实现所定义。

和描述List.IndexOf() http://msdn.microsoft.com/en-us/library/e4w08k17%28v=vs.110%29.aspx says

此方法使用 T(列表中值的类型)的默认相等比较器 EqualityComparer.Default 来确定相等性。

and 相等比较器.默认值 http://msdn.microsoft.com/en-us/library/ms224763%28v=vs.110%29.aspx描述说

Default 属性检查类型 T 是否实现 System.IEquatable 接口,如果是,则返回使用该实现的 EqualityComparer。否则,它返回一个 EqualityComparer,该 EqualityComparer 使用 T 提供的 Object.Equals 和 Object.GetHashCode 的重写。

这有点可疑 - 的描述Contains仅提及IEquatable并且可以放置未实现的东西IEquatable into a List.

所以我猜他们只是使用相同的语义,也许Contains() reuses IndexOf().

那么它们在比较方面完全等效吗?


简短回答:

  • No, Contains()不重复使用IndexOf()
  • 是的,比较起来它们是等效的

我反编译(ReSharper)并看到最终都使用了抽象EqualityComparer<T>.Default.Equals(T x, T y)方法。这Default实例为EqualityComparer<T>根据类型 T 进行初始化(并缓存)。

列表.包含

EqualityComparer<T> @default = EqualityComparer<T>.Default;
// for loop
if (@default.Equals(this._items[index], item))
    return true;

列表索引

return Array.IndexOf<T>(this._items, item, 0, this._size);

数组索引

public static int IndexOf<T>(T[] array, T value, int startIndex, int count)
{
    // Some assertions
    return EqualityComparer<T>.Default.IndexOf(array, value, startIndex, count);
}

相等比较器.IndexOf

internal virtual int IndexOf(T[] array, T value, int startIndex, int count)
{
    // for loop
    if (this.Equals(array[index], value))
        return index;
}

这就是如何相等比较器.默认值被实例化

public static EqualityComparer<T> Default
{
  get
  {
    EqualityComparer<T> equalityComparer = EqualityComparer<T>.defaultComparer;
    if (equalityComparer == null)
    {
      equalityComparer = EqualityComparer<T>.CreateComparer();
      EqualityComparer<T>.defaultComparer = equalityComparer;
    }
    return equalityComparer;
  }
}

private static EqualityComparer<T> CreateComparer()
{
  RuntimeType genericParameter1 = (RuntimeType) typeof (T);

  if ((Type) genericParameter1 == typeof (byte))
    return (EqualityComparer<T>) new ByteEqualityComparer();
  // Some ifs go on
  else
    return (EqualityComparer<T>) new ObjectEqualityComparer<T>();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

List.Contains 在比较方面完全等同于 List.IndexOf 吗? 的相关文章

随机推荐

  • Common Lisp 案例和引用元素

    我正在用 CL 编写一个地下城爬行游戏 但在处理案例表单时遇到了问题 两件事情 Common Lisp 抱怨Duplicate keyform QUOTE in CASE statement make instance cl rogue t
  • 如何在 python-flask 中添加自定义字体?

    我尝试过使用 fontface css 样式 但字体没有渲染 还有另一种方法可以使用 python flask 来做到这一点吗 p style font family trial font weight bold Hello p 上面是我的
  • 使 Div 向上滚动时返回到其原始位置

    当您向下和向上滚动时 我有一个带动画的 div 问题是 当我非常快地向上和向下滚动而不让 div 完成其动画时 div 会逐渐从上部屏幕中消失 如果我删除 animate 函数中的 stop 并快速上下滚动 div 会继续执行此操作一段时间
  • 如何在Android Studio上实时查看Sqlite数据库中插入的数据

    你能帮我解决这个问题吗 我正在将值插入到我的 Sqlite 数据库中 如何检查或查看插入的数据 有没有任何工具或其他技术来显示数据 如果您想显示数据Log尝试下面的代码 for Contact cn contacts String log
  • .NET Standard 2.0 无法在 .NET Framework 2.0 中引用

    我收到一个错误 c xxxx csproj 目标为 NETStandard Version v2 0 它无法被面向 NETFramework Version v2 0 的项目引用 WindowsFormsApp1 如何解决 遗憾的是 您无法
  • 用核心运动计算倾斜角

    我的申请有一个记录会话 当用户开始记录会话时 我开始从设备的 CMMotionManager 对象收集数据并将它们存储在 CoreData 上以供稍后处理和呈现 我正在收集的数据包括 GPS 数据 加速度计数据和陀螺仪数据 数据的频率为10
  • 将 webkit 滚动条样式应用于指定元素

    我对以双冒号为前缀的伪元素很陌生 我看到一篇博客文章讨论使用一些仅适用于 webkit 的 css 来设置滚动条的样式 伪元素 CSS 可以应用于单个元素吗 This works by applying style to all scrol
  • 在节点主管中,如何监视目录中的所有内容是否发生更改?

    https github com isaacs node supervisor https github com isaacs node supervisor 我想查看 api 目录及其所有子目录内的所有内容 递归地 我怎样才能做到这一点
  • CouchDB 入门

    我已经在我的 Linux 云服务器上安装了 CouchDB 并且我正在尝试访问 Futon 欢迎屏幕 O Reilly 书中说要转到 127 0 0 1 portnum 但我不在本地主机上工作 它是我的远程服务器 所以我应该能够使用 xxx
  • 使用指定的初始化器初始化数组时出现奇怪的值

    当我初始化下面的数组时 所有输出看起来都正常 除了values 3 因为某些原因values 3 初始化为values 0 values 5 正在输出一个非常大的数字 我的猜测是我正在尝试分配values 0 values 5 在它们被正确
  • Android 中如何获取联系人信息

    我正在开发一个在android平台上编写短信的应用程序 为此 我需要获取 联系人 最近联系人 和 组 请告诉我任何教程或如何执行此操作的代码 当我们单击这三个按钮中的任何一个时 应该会出现联系人以及用于选择多个联系人的复选框 谢谢 这是以编
  • Three.js 如何从向量和常量得到平面?

    在 Three js 中 构造函数数学平面 http threejs org docs api math Plane html需要 2 个输入 法线 Vector3 定义指向原点的平面的法线向量 Constant Float 沿法向量从原点
  • 在 dart angular2 的组件中使用 paper-tabs

    我正在尝试在 dart Angular2 组件中使用聚合物纸标签 但我做不到 下面的代码中我缺少什么 在以下代码中 index html 模板中指定的 paper tabs 工作正常 但 main app html 中的 paper tab
  • 使用 window.crypto.getRandomValues 在 JavaScript 中洗牌扑克牌

    一副扑克牌有 52 张牌 因此52 或大致2 226可能的排列 现在我想完美地洗牌这样一副牌 具有真正随机的结果和均匀的分布 这样你就可以达到这些可能的排列中的每一个 并且每个排列出现的可能性相同 为什么这实际上是必要的 对于游戏来说 也许
  • 如何在 Sanity.io 中的输入组件内检索引用字段数据?

    在 Sanity Studio 中 我试图获取输入组件内的所有文档属性 关注这篇文章官方支持的获取文档内容的方式 https github com sanity io sanity issues 417 issuecomment 35551
  • 如何使用 Google Apps 脚本和 Discord Webhook 将图像上传到 Discord?

    我编写了以下脚本 function uploadImageToDiscord var link https i imgur com image jpg var img UrlFetchApp fetch link getBlob var d
  • 添加带有动态生成的 editText 的删除选项

    我是 android 新手 我在单击添加新按钮时使用以下代码动态创建了 editText 是否可以在 editText 附近添加一个删除按钮 以便每次单击删除时相应的 editText 都会被删除 btnAddNew setOnClickL
  • AWS SDK for Java 是否通过安全通道与 S3 服务器进行通信?

    我想这是一个很大的 是 但我更喜欢在假设之前先问一下 那么 您知道当我从 S3 存储桶下载文件 向 S3 存储桶上传文件时 AWS SDK for Java 是否始终使用安全通道 或者这是我在编写代码或 S3 存储桶本身时应该配置的内容 A
  • 无法声明 MonadPlus 接口受 Monad 约束

    我试图像这样声明 MonadPlus 接口 module NanoParsec Plus access public export interface Monad m gt MonadPlus m where zero m a plus m
  • List.Contains 在比较方面完全等同于 List.IndexOf 吗?

    MSDN 描述列表 包含 http msdn microsoft com en us library bhkz42b3 28v vs 110 29 aspx says 此方法通过使用默认相等比较器来确定相等性 该比较器由 T 列表中的值的类