首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么C#.NET SortedList <T1,T2>实际上没有ElementAt?

在C#中,SortedList<T1, T2>是一个泛型类,用于存储一组键值对,其中键是唯一的,并按升序排序。SortedList<T1, T2>没有ElementAt方法的原因是它没有实现IEnumerable<KeyValuePair<T1, T2>>接口。这个接口提供了ElementAt方法,允许我们通过索引访问集合中的元素。

然而,SortedList<T1, T2>实现了IDictionary<T1, T2>接口,该接口提供了一种不同的方式来访问集合中的元素。我们可以使用Keys属性来获取SortedList<T1, T2>中的所有键,然后使用索引访问相应的值。

例如,如果我们有一个SortedList<int, string>,我们可以使用以下代码来访问第一个元素:

代码语言:csharp
复制
var sortedList = new SortedList<int, string>();
sortedList.Add(1, "one");
sortedList.Add(2, "two");
sortedList.Add(3, "three");

int key = sortedList.Keys.ElementAt(0);
string value = sortedList[key];

在这个例子中,我们使用ElementAt方法从Keys属性返回的集合中获取第一个键,然后使用该键从SortedList<int, string>中获取相应的值。

如果您需要使用ElementAt方法访问SortedList<T1, T2>中的元素,可以将其转换为IEnumerable<KeyValuePair<T1, T2>>,如下所示:

代码语言:csharp
复制
var sortedList = new SortedList<int, string>();
sortedList.Add(1, "one");
sortedList.Add(2, "two");
sortedList.Add(3, "three");

var kvp = sortedList.Cast<KeyValuePair<int, string>>();
KeyValuePair<int, string> firstElement = kvp.ElementAt(0);

在这个例子中,我们使用Cast<KeyValuePair<int, string>>方法将SortedList<int, string>转换为IEnumerable<KeyValuePair<int, string>>,然后使用ElementAt方法获取第一个元素。

总之,SortedList<T1, T2>没有ElementAt方法是因为它没有实现IEnumerable<KeyValuePair<T1, T2>>接口。但是,您可以使用Keys属性或将SortedList<T1, T2>转换为IEnumerable<KeyValuePair<T1, T2>>来访问其元素。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

并发模型:线程与锁(2)

在锁定状态下,某些线程拥有锁 ; 在非锁定状态下, 没有线程拥有它。 若要锁定锁,线程调用其 acquire() 方法;一旦线程拥有了锁,方法将返回。若要解锁,线程调用 release() 方法。..., t2 = T1(), T2() t1.start() t2.start() t1.join() t2.join() if __name__ == "__main...= SortedList(head) t2 = SortedList(head) t1.start() t2.start() t1.join() t2.join...原子变量 与锁相比使用原子变量的优点: 不会忘记在正确的时候获取锁 由于没有锁的参与,对原子变量的操作不会引发死锁。...缺点 线程与锁模型没有为并行提供直接的支持 线程与锁模型只支持共享内存模型,如果要支持分布式内存模型,就需要寻求其他技术的帮助。

25920

C Sharp(十二)

概述 没有泛型的时候,我们封装的行为都是作用在特定类型上的,但是,很多时候如果我们把行为提取或重构出来,使其可以应用到很多类型上去的话,那么就会更有意义。这也是泛型出现的原因。..., T2> { public T1 SomeVal = new T1(); public T2 OtherVal = new T2(); } 创建构造类型 列出类名并在尖括号中提供真实类型代替类型参数..., T2, T3> where T2: Customer where T3: IComparable {...任何带有无参构造的类型才能做 type argument 顺序: 主约束必须放在第一位且只有一个: 主约束只能是类名、class 或者 struct 接口名约束可以有任意多个 如果存在构造约束,必须放在最后 class SortedList..., T2, TR>(T1 p1, T2 p2); class Simple { static string PrintString(int a, int b) { var

81320

技术分享 | 详解 MySQL 三表 JOIN

这结论与我们通常认为的三表 JOIN 实际上是三表嵌套的循环连接不一样,接着往下看。...图示(这里展示的是索引嵌套循环算法时三表 JOIN 的流程,块循环嵌套算法不一样): 注意:由于造的数据比较特殊,所以第 3 步得出的中间结果集实际上只有 1 行,所以最终 t2 表的查找次数是 20...=t3.b where t1.a<21; 为什么执行计划中分析得到的是 t2 表查找 400 次呢?...为什么执行计划中,t2 表的执行次数是用 “t1 join t3 的扇出” 表示的?这不是说明 t1 先和 t3 JOIN,结果再和 t2 JOIN?...当被驱动表的关联字段不是唯一索引,或者没有索引,每次扫描行数会大于 1 时,其扇出误差会非常大。

66710

补偏救弊 | 关于一致性读与语句性能关系的一大误区

但是为什么第二条语句的 CG 更少呢?...显然,它包含两个部分:对 T1T2 的全表扫描访问。 在该执行计划当中,T1 的全表扫描的 CG 为 164,当时为什么在第一条语句中对其的全部扫描产生的 CG 为 466 呢?...为什么结果是 m+n? 实际上,Oracle 确实对 T1 做了多次重复访问。不过,第一次访问后,读取到的数据被缓存到了私有工作区,接下来的访问就是从私有内存而非共享内存中读取数据。...因此,这些访问就没有被记入 CG 当中。...为了获取实际的访问次数,我们使用嵌套关联提示使其从共享内存中读取数据: SQL代码HelloDBA.COM> select /*+use_nl(t1) leading(t1)*/* from t1, t2

66840

补偏救弊 | 关于一致性读与语句性能关系的一大误区

但是为什么第二条语句的 CG 更少呢?...显然,它包含两个部分:对 T1T2 的全表扫描访问。 在该执行计划当中,T1 的全表扫描的 CG 为 164,当时为什么在第一条语句中对其的全部扫描产生的 CG 为 466 呢?...为什么结果是 m+n? 实际上,Oracle 确实对 T1 做了多次重复访问。不过,第一次访问后,读取到的数据被缓存到了私有工作区,接下来的访问就是从私有内存而非共享内存中读取数据。...因此,这些访问就没有被记入 CG 当中。...为了获取实际的访问次数,我们使用嵌套关联提示使其从共享内存中读取数据: SQL代码HelloDBA.COM> select /*+use_nl(t1) leading(t1)*/* from t1, t2

39020

in 和 exists 的不同

其原因主要有两个: not in 会出现 BUG 表t1 c1 c2 1 2 1 3 表t2 c1 c2 1 2 1 先执行 not in select * from t1 where t2 not...in(select c2 from t2); 这个时候,我们可以看到,先查询出 t2.c2 的值(2,null), 也就是,我们把这个语句变成了 select * from t1 where t2 <...这是为什么呢? 这主要是因为 null 是无法进行“操作”的,也就是 null 的几个原则: 如果 null 参与算术运算,则该算术表达式的值为 null 。...select * from t1 where not exists(select c2 from t2 where t2.c2 = t1.c2); 得到的结果是 c1 c2 1 3 OK,这就是我们想要的结果...not in 比 not exists 慢 如果查询语句使用了 not in 那么内外表都进行全表扫描,没有用到索引;而 not extsts 的子查询依然能用到表上的索引。

78910

技术分享 | 隔离级别:正确理解幻读

Transaction T2 then creates data items that satisfy T1’sand commits....翻译一下:事务 T1 读取一组满足某些 的数据。事务 T2 创建了满足 T1 的 的数据项并提交。如果 T1 用相同的再次读取,得到一组不同于第一次读取的数据。...a<5; T2T1的Q1和Q2之间执行并提交以下任意SQL,并造成T1的Q2读到不一样的结果: //T2 Q1:insert into t(a) values(2); //这个符合幻读定义...为什么? 先说答案:不允许。但实际上这个问题略显复杂,我们分几点来阐述。 1....问题2中描述了为什么 ANSI repeatable-read 允许幻读的原理:因为事务T1的读只对满足条件的数据行加锁,而事务T2插入的位置是数据行之间的间隙,不会被阻塞。

73450

多线程内幕

虽然 t1.start 是在 t2.start之前调用的,但这并不意味着t1就一定会在t2之前打印出计算结果。 t1的执行和t2的执行实际上是交替执行的。...左边代表 t1 运行时的栈空间,右边代表 t2 运行时的栈空间。...在单核的情况下,CPU会在t1上干一会活,然后保存t1的现场,转到t2上再干一会儿,然后保存t2的现场,再转回t1上,把现场恢复了,从刚才停下的地方继续干t1的活儿。...这个现象就说明了多线程编程为什么这么困难。线程之间,各个指令的执行顺序是不确定的。而写程序,最怕的就是不确定性。...可是为什么每一次的结果都不相同呢? 这是因为,做一次加法,实际上,包含了很多条机器指令。一条高级语言的语句,例如Java,C++等语言,会被翻译成多条机器指令来执行。机器指令是CPU真正看懂的指令。

62880

Xcode13 适配之打印启动时间

- __t1 / 1000; double didfinish = __t3 - __t2; double total = __t3 - __t1 / 1000;...pre-main()阶段开始时间:__t1 苹果公司并没有直接向开发者提供内部统计时间字段以供开发者直接获取App的启动开始时刻点,目前行业内主要有两种标准作为App的启动时间点: 第一种标准:以名称+...这种方式没有统计到Initializer初始化配置阶段前面部分所消耗的那些时间,比如在Initializer初始化配置阶段前面增加动态库、Category等造成的耗时并不能被及时发现统计。...第二种标准:获取整个进程创建(从开始到结束)消耗时间 App从源头配置直至运行整个过程实际上是一个逻辑进程,如果能获取到逻辑进程的起步创建时间即exec()可执行函数触发阶段的触动时间点作为整个app逻辑进程的开始时间点...推荐使用__attribute__((constructor)) 构建器函数的被调用时间点作为pre-main()阶段结束时间点:__t2 为什么不用最后一个load方法执行时间作为pre-main()

33500

从CPU角度理解Go中的结构体内存对齐

T1结构体,共有3个字段,类型分别为int8,int64,int32。所以变量t1所属的类型占用的空间应该是1+8+4=13字节。但运行程序后,实际上是24字节。和我们计算的13字节不一样啊。...如果我们把该结构体的字段调整成T2那样,结果是16字节。但和13字节还是不一样。这是为什么呢?...:= T1{} fmt.Println(unsafe.Sizeof(t1)) // 24 bytes t2 := T2{} fmt.Println(unsafe.Sizeof...以T1结构体为例,实际存储数据的只有13字节,但实际用了24字节,浪费了将近一半,那有没有什么办法既可以做到内存对齐提高CPU读取效率又能减少内存浪费的吗? 答案就是调整struct字段的顺序。...没超过1个字长(8字节),但在内存中的分布是如下图这样: 我们发现b并没有直接在a的后面,而是在a中填充了一个空白后,放到了偏移量为2的位置上。为什么呢? 答案还是从内存对齐的定义中推导出来。

61420

cost量化分析

,比如说明明有索引,或者好几个索引,但是为什么查询时未使用到期望的索引等 explain select * from basic_person_info t1 join basic_person_info2...t2表上列出了多个可能使用的索引,却选择了idx_age,优化器为什么选择了指定的索引,这时候并不能直观的看出问题,这时候我们就可以开启optimizer_trace跟踪分析MySQL具体是怎么选择出最优的执行计划的...表走了全表扫描了而没有走idx_age索引,分别查看一下t2表走全表扫描和idx_age索引的cost发现全表扫描的cost为13491.1,而走索引的cost为96,909.4,因为全表扫描的cost...比走索引低,所以优化器没有选择idx_age索引。...CPU成本和IO成本组成,每个成本常数值可以自己调整,非必要的情况下不要调整,以免影响整个数据库的执行计划选择 通过开启optimizer_trace可以跟踪优化器的各个环节的分析步骤,可以判断有时候为什么没有走索引而走了全表扫描

28020
领券