C# 中类似Java Map功能的语句是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 中类似Java Map功能的语句是啥相关的知识,希望对你有一定的参考价值。

如题

集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问)
一个集合包括多个元素,即有一个集合类对象和N个元素对象

因为任何集合类都实现了IEnumerable接口,所以任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口的对象,这个返回的IEnumerator对象既不是集合类对象,也不是集合的元素类对象,它是一个独立的类对象。通过这个对象,可以遍历访问集合类对象中的每一个元素对象

如果集合类是用户自定义的集合类,则用户必须实现它的GetEnumerator()方法,否则不能使用循环。当然,与这个自定义集合类对应的IEnumerator类(实现了该接口的类),也要自定义一个才行

比如,ArrayList集合类对应的IEnumerator是 ArrayListEnumeratorSimple
Array集合类对应的IEnumerator是 SZArrayEnumerator
(这两个类在.net framework类库文档(msdn)中都没有介绍)

1.System.Colloctions中表示集合的行为的接口有:
1)ICollection
定义所有集合的大小、枚举数和同步方法。派生于IEnumerable
它定义了集合类最基本的行为,所有的集合类都实现了这个接口(基接口)
但是它的行为太过基本:主要就是一个Count属性,单独实现它没有太大意义

2)IEnumerable
公开枚举数,该枚举数支持在集合上进行简单迭代
它只有一个方法 GetEnumerator(),该方法可以返回一个IEnumerator接口,通过它可以遍历集合
基本上所有的集合类都实现了这个接口

3)IList
IList实现是可排序且可按照索引访问其成员的值的集合,它本身实现了ICollection和IEnumerable接口
是所有列表的抽象基类。IList 实现有三种类别:只读、固定大小、可变大小。

4)IDictionary
IDictionary实现是键/值对的集合,它本身实现了ICollection和IEnumerable接口
是键/值对的集合的基接口。IDictionary 实现有三种类别:只读、固定大小、可变大小。
IDictionary可称为字典、映射或散列表,它根据键(任意类型)来访问值

2.System.Collections中可以直接使用的集合类有:
1)ArrayList
实现了接口:IList、ICollection、IEnumerable
只要集合未被修改,ArrayList 就可安全地同时支持多个读取器
随着向 ArrayList 中添加元素,容量通过重新分配按需自动增加(2倍增加)
如果需要建立一个对象数组,但不能预先知道数组的大小,就可以使用ArrayList
ArrayList把所有元素都当作object对象引用,因而在访问ArrayList的元素时要进行类型转换
优点:动态改变大小、灵活方便的插入和删除元素、可排序
缺点:插入时性能不如数组、不是强类型的

2)BitArray
实现了接口:ICollection、IEnumerable
管理位值的压缩数组。

3)Hashtable
实现了接口:IDictionary、ICollection、IEnumerable
可以向Hashtable中自由添加和删除元素,有些像ArrayList,但没有那么大的性能开销

4)SortedList
实现了接口:IDictionary、ICollection、IEnumerable
SortedLIst兼顾了ArrayList和Hashtable的优点,可按键值来排序

5)Queue
实现了接口:ICollection、IEnumerable
Queque是队列,先进先出的访问各个元素
可以调用Queque对象的GetEnumerator()方法,得到IEnumerator对象,来遍历队列中的各个元素

6)Stack
实现了接口:ICollection、IEnumerable
Stack是堆栈,后进先出的访问各个元素
可以调用Stack对象的GetEnumerator()方法,得到IEnumerator对象,来遍历堆栈中的各个元素

3.上面提到的几种集合类,他们都是通用的集合类,他们所接受的元素大都是Object类型,当对象放入
了集合之后,都失去了原有的类型信息-即这些通用集合类都不是强类型的
解决办法是使用强类型的集合类
System.Collections命名空间下的CollectionBase,DictionaryBase,ReadOnlyCollectionBase 类
System.Collections.Specialized命名空间下的一些类可以满足要求,可以直接使用也可以继承
参考技术A 哈希表是吧?
非泛型的有Hashtable,泛型的有Dictionary<T,D>本回答被提问者和网友采纳
参考技术B 你说的是键——值对应关系吗?是的话在C#中也有和Java类似的类ListItem

是啥? JavaScript 中的语法是啥意思?

【中文标题】是啥? JavaScript 中的语法是啥意思?【英文标题】:What does the ?. syntax mean in JavaScript?是什么? JavaScript 中的语法是什么意思? 【发布时间】:2020-06-01 12:11:41 【问题描述】:

我在一个 React 项目中遇到了类似 C# 的代码。我无法确认此语法是否正确。我没有找到任何支持这种语法的最新 ES 版本。在当前情况下,我无权执行和检查此代码。

我尝试在浏览控制台中测试此语法并遇到错误:

cart?.widgets?.items.map(widget => (
        <div className="billing-details__box" key=widget.id>
          <p className="m-0">widget.name</p>
          <p className="my-0">widget.value $</p>
        </div>
 ))

我对上述代码的担忧是cart?.widgets?.items 是否会引发任何错误。

【问题讨论】:

Optional chaining 这能回答你的问题吗? Does Typescript support the ?. operator? (And, what's it called?) 这段代码在一个javascript文件中。 你怎么可能修改你无法执行的代码? 【参考方案1】:

我无法确认此语法是否正确。

它是正确的 TypeScript 代码,并且是正确的 JavaScript,具体取决于您运行它的引擎。Chrome (V8) 已经支持这种语法(请参阅 caniuse.com)。

您可以在此处阅读更多关于 proposal to add this syntax 未来 JS 规范的信息。

这是什么?

这种语法称为可选链接运算符,它允许您访问对象上可能存在或不存在的属性而无需检查属性是否存在,无论多深属性访问表达式是

例如,假设我们有这样的对象:

const user = 
  details: 
    name: "SpongeBob SquarePants"
  ,
  repo: null
;

我们想得到他们的名字,如果存在的话,还有一些属性user.repo.url。我们可以使用可选的链接运算符来获取两者,而不必担心repo 是否是一个对象:

console.log(user.details.name) //=> "SpongeBob SquarePants"
console.log(user.repo.url) //=> undefined

它也适用于函数调用。例如,假设user.repo 有一个值,我们知道它将是一个返回字符串的函数。但是,有时,如上所述,它可能不是一个函数。如果函数存在,我们可以执行以下操作来调用该函数,但如果user.repo.url 处的值不是函数,则代码不会抛出错误:

console.log(user.repo?.url()) //=> undefined

没有可选的链接运算符?

您可以通过显式检查您正在访问的属性链中每个对象属性的真实性来实现与可选链接运算符类似的行为。

这可以通过利用 JavaScript 的 short-circuit evaluation 行为来完成,或者更明显的是使用 ternary operator。

看起来像这样:

function getItems_shortCircuit(obj) 
  return obj && obj.widgets && obj.widgets.items


function getItems_ternary(obj) 
  return obj 
    ? obj.widgets 
      ? obj.widgets.items 
        ? obj.widgets.items 
        : null 
      : null
    : null


let cart = 
  widgets: null


console.log(getItems_shortCircuit(cart)) //=> null

cart.widgets = 
  items: ["a", "b"]


console.log(getItems_ternary(cart)) //=> ["a", "b"]

我对上述代码的担忧是cart?.widgets?.items 是否会引发任何错误。

这取决于项目是否使用 TypeScript,它支持开箱即用的optional chaining (?.)。你可以在TypeScript documentation阅读它。

如果你不使用 TypeScript,那么你必须使用一些 ESNext 编译器来编译你的应用程序,比如 Babel,它有 @babel/plugin-proposal-optional-chaining plugin。

【讨论】:

你有点错了,可选链实际上已经是正确的 JavaScript 并且在 Chrome 80+(目前是默认版本)和 Firefox 74+(目前是开发版本)中有效现在。但是,如果您针对其他浏览器,您仍然需要进行转译。 caniuse.com/#search=optional%20chaining 是的,我很高兴看到它在本月初在 Chrome 中上线。很好的答案! 我猜对于其他浏览器,babel 会将此代码转换为支持的 javascript 代码 @VirajSingh 这是正确的——只要你使用答案中链接的插件,一旦它被 Babel 编译,你就可以在任何地方使用这个语法。 如果您不知道,nullish coalescing operator ?? 现在也在 Chome 80+ 和常规 Firefox (72+) 中使用!现在我们只需要 Safari 和 Edge 即可使用该程序!【参考方案2】:

可选链是JS的新特性。

基本上是一样的:

cart && cart.widgets && cart.widgets.items.map(widget => (
        <div className="billing-details__box" key=widget.id>
          <p className="m-0">widget.name</p>
          <p className="my-0">widget.value $</p>
        </div>
 ))

欲了解更多详情,请务必访问V8 guide。

【讨论】:

【参考方案3】:

它将由 Babel 编译并且可以工作。 https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining

【讨论】:

【参考方案4】:

这可能是来自 Typescript 的 optional chaining。

【讨论】:

... 和 JavaScript! caniuse.com/#search=optional%20chaining【参考方案5】:

它是可选链接,如果您使用 polyfill,它不会导致任何错误。 “?。” - 默认还不支持

【讨论】:

本月起在 Chrome (80+) 和 Firefox Developer Edition (74+) 中支持! caniuse.com/#search=optional%20chaining

以上是关于C# 中类似Java Map功能的语句是啥的主要内容,如果未能解决你的问题,请参考以下文章

C# 中没有类型的新功能是啥?

VS2010中 生成、生成解决方案、开始执行(不调试),这三个是啥意思,三者之间有啥联系?(C#语言)

VS2010中 生成、生成解决方案、开始执行(不调试),这三个是啥意思,三者之间有啥联系?(C#语言)

汽车map是啥意思?

c语言中的shuffle函数功能是啥?

汽车MAP是啥?