KeyValuePair C#[通俗易懂]

KeyValuePair C#[通俗易懂]前几天自学了keyvaluepair,在网上找到一篇很好的Blog,所以转载过来共享。转载地址:http://www.cnblogs.com/C#KeyValuePairKeyValuePairstorestwovaluestogether.Itisasinglegenericstruct.TheKeyValuePairtypeinSyste…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前几天自学了keyvaluepair,在网上找到一篇很好的Blog ,所以转载过来共享。

 

转载地址:http://www.cnblogs.com/

C# KeyValuePair

KeyValuePair: Key and Value properties

KeyValuePair stores two values together. It is a single generic struct. The KeyValuePair type in System.Collections.Generic is simple and always available. It is used internally in Dictionary.

Example

First, this example uses KeyValuePair in a List, which is also in System.Collections.Generic. This is useful for storing pairs of values in a single List. You could use two separate Lists, but that can complicate matters.

ListList

Here:We initialize a new List of type KeyValuePair.
This shows the required syntax form.

Note:Inside the brackets in the KeyValuePair, there are two types separated by a comma (string, int).

StringsInt

Program that uses KeyValuePair: C#

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
	// Shows a List of KeyValuePairs.
	var list = new List<KeyValuePair<string, int>>();
	list.Add(new KeyValuePair<string, int>("Cat", 1));
	list.Add(new KeyValuePair<string, int>("Dog", 2));
	list.Add(new KeyValuePair<string, int>("Rabbit", 4));

	foreach (var element in list)
	{
	    Console.WriteLine(element);
	}
    }
}

Output

[Cat, 1]
[Dog, 2]
[Rabbit, 4]

Key: used to access value

Also, we can create a new KeyValuePair with its constructor. The constructor is shown in the List.Add calls. The KeyValuePair’s constructor returns the new KeyValuePair, and that instance is added.

List Add

Note:Instead of a List, you could use an array here. You can specify the KeyValuePair<string, int> as the type of the array.

Example 2

Return keyword

Often, you need to return two separate values from a method. You can do this easily with KeyValuePair. You must specify the exact type in the return value, and then return the new KeyValuePair in the method body.

Tip:This is clearer than a two-element array.
Consider out or ref parameters instead.

OutRef

Program that returns two values: C#

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
	Console.WriteLine(GetNames());
    }

    static KeyValuePair<string, string> GetNames()
    {
	// Gets collection of first and last name.
	string firstName = "William";
	string lastName = "Gates";
	return new KeyValuePair<string, string>(firstName, lastName);
    }
}

Output

[William, Gates]

Error

Warning: exclamation mark

When using KeyValuePair in your program, you will likely get this error at some point. The C# compiler doesn’t allow you to assign the Key and Value properties. This must be assigned in the constructor.

Error:

Property or indexer 'System.Collections.Generic.KeyValuePair...Key'
cannot be assigned to--it is read-only.

Dictionary loop

Loop

Probably the most popular usage of KeyValuePair is in a loop over a Dictionary. The Dictionary collection in C# has an enumerator that returns each key and value in a KeyValuePair, one at a time. Examples are available.

Dictionary

Also:An improved syntax could be to use the var keyword with the foreach loop over your Dictionary. This shortens the syntax.

Var

Sort

Sorted letters: A to Z

How can you sort a collection of KeyValuePair instances? You can implement a custom sorting Comparison method. We use the delegate method syntax. The linked tutorial contains information on this approach.

Sort KeyValuePair List

Also, you may use KeyValuePair in a List to create two parallel Lists. These are easily sorted, keeping both values together. This site has an example of an accurate shuffle algorithm with KeyValuePair and List.

Shuffle Array

Implementation

Framework: NET

You should know the basic layout of the KeyValuePair struct. Here, we see the internal code. The KeyValuePair has two private fields, and two public properties that retrieve the values of those fields.

Property

Implementation of KeyValuePair: C#

[Serializable, StructLayout(LayoutKind.Sequential)]
public struct KeyValuePair<TKey, TValue>
{
    private TKey key;
    private TValue value;
    public KeyValuePair(TKey key, TValue value);
    public TKey Key { get; }
    public TValue Value { get; }
    public override string ToString();
}

ToString

String type

The ToString method is useful. When you want to display the values, simply call ToString or pass the KeyValuePair to Console.Write or Console.WriteLine. This will implicitly call ToString. Internally, ToString uses a StringBuilder.

Console.WriteStringBuilder

Performance

Performance optimization

Is there any advantage to using custom structs instead of KeyValuePair generic types? Conceptually, the two approaches should be precisely equivalent in functionality, but there are some differences in performance.

KeyValuePair performance
    KeyValuePair influenced how the method was inlined.

Method that uses normal struct: 0.32 ns
Method that uses KeyValuePair:  4.35 ns

Next, we figure out what we are comparing. It is always possible to use custom structs with two fields instead of a KeyValuePair with those types. My question was whether this is ever worthwhile doing.

Struct

Version 1

struct CustomPair
{
    public int Key;
    public string Value;
}

Version 2

KeyValuePair<int, string>

Next, we look at a benchmark that compares the two structs. You would think that the .NET Framework would compile the two methods in the exactly same way, but I found the methods are inlined in different ways.

Overload Method

Program that tests KeyValuePair performance

using System;
using System.Collections.Generic;
using System.Diagnostics;

struct CustomPair
{
    public int Key;
    public string Value;
}

class Program
{
    const int _max = 300000000;
    static void Main()
    {
	CustomPair p1;
	p1.Key = 4;
	p1.Value = "perls";
	Method(p1);

	KeyValuePair<int, string> p2 = new KeyValuePair<int, string>(4, "perls");
	Method(p2);

	for (int a = 0; a < 5; a++)
	{
	    var s1 = Stopwatch.StartNew();
	    for (int i = 0; i < _max; i++)
	    {
		Method(p1);
		Method(p1);
	    }
	    s1.Stop();
	    var s2 = Stopwatch.StartNew();
	    for (int i = 0; i < _max; i++)
	    {
		Method(p2);
		Method(p2);
	    }
	    s2.Stop();

	    Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) /
		_max).ToString("0.00 ns"));
	    Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) /
		_max).ToString("0.00 ns"));
	}
	Console.Read();
    }

    static int Method(CustomPair pair)
    {
	return pair.Key + pair.Value.Length;
    }

    static int Method(KeyValuePair<int, string> pair)
    {
	return pair.Key + pair.Value.Length;
    }
}

Result

0.32 ns
4.35 ns
0.32 ns
4.34 ns
0.32 ns
4.36 ns
0.32 ns
4.35 ns
0.32 ns
4.36 ns

Just-in-time compiler: JIT

I looked inside the two Method implementations in the IL Disassembler tool. They have the same code size. But in the KeyValuePair version, the call instruction is used instead of ldfld because KeyValuePair uses properties.

IL Disassembler

After C# compilation, the program is JIT-compiled during runtime. The behavior of the inliner is sometimes hard to determine. Extra members that need inlining sometimes influence the inliner and end up reducing performance.

JIT Method Test

Tip:It is possible to improve performance by replacing a KeyValuePair with a regular struct.

Benchmark

Discussion

Object-oriented programming

In some contexts—such as internal method code—using KeyValuePair is convenient and simple. But using a class or struct you define yourself can definitely enhance the object-orientation of your program.

Therefore:I suggest you prefer classes when the usage is not trivial. This improves object-oriented design.

ClassObject-Oriented Programming

Tuple. Another option now available in the .NET Framework is the Tuple type. You can have a two-element Tuple. A Tuple is a class, not a struct. It can also have many more items in it.

Tuple

Summary

KeyValuePair C#[通俗易懂]

We saw examples of using KeyValuePair in the C# language, and also looked into its internals in the .NET Framework. Lists and Dictionaries are ideal companions for KeyValuePairs. We returned the collection from methods.

转载于:https://www.cnblogs.com/Artemisblog/p/3706054.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158819.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python3.9多线程_python创建多线程

    python3.9多线程_python创建多线程什么是线程?线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其

    2022年7月28日
  • OCX制作CAB,数字签名制作

    OCX制作CAB,数字签名制作从网上找了些相关的资料,最终制作成功,做个小的总结:首先准备好必须的工具如下:制作工具:iexpress.exe和makecab.exe,签名工具:cert2spc.exe,makecert.exe,signcode.exe下面我具体说如何使用他们来帮助我们制作需要的cab包。下面是我引用网上的资料信息.1.将ocx文件以及第三方dll文件打包成…

    2022年7月14日
  • 解决动态生成的SQL中特殊字符的问题 QuotedStr function「建议收藏」

    解决动态生成的SQL中特殊字符的问题 QuotedStr function「建议收藏」Returnsthequotedversionofastring.UnitSysUtilsCategoryStringhandlingroutinesDelphisyntax:functionQuotedStr(constS:string):string;DescriptionUseQuotedStrtoco…

    2022年10月10日
  • Jlink或者stlink用于SWD接口下载程序「建议收藏」

    Jlink或者stlink用于SWD接口下载程序「建议收藏」最近要使用stm32f103c8t6最小系统板,直接ISP串口下载程序太麻烦,就想着使用swd接口来调试。结果:通过SWD接口下载程序成功,但调试失败,还不知原因,会的的人麻烦交流一下。SWD接口:3.3VDIO(数据)CLK(时钟)GND1.首先声明jlink和stlink都有jtag和swd调试功能。jlink接口如下:如图,我使用的就是VCC…

    2022年4月25日
  • 博客:”重读黑客与画家”

    博客:”重读黑客与画家”

    2021年5月11日
  • 分布式事务TCC框架-hmily(spring cloud feign)

    分布式事务TCC框架-hmily(spring cloud feign)官网案例:文档(springcloud):https://dromara.org/zh/projects/hmily/user-springcloud/官网示例:https://github.com/dromara/hmily/tree/master/hmily-demo/hmily-demo-springcloud本示例:https://codechina.csdn.net/wwwzhouzy/zhouzy-hmily一、说明hmily是一个高性能异步分布式事务TCC框架,具有以下..

    2022年5月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号