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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • node.js获取RSS返回json

    node.js获取RSS返回json

  • datagrip在线激活码[免费获取]

    (datagrip在线激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • Nginx负载均衡失效「建议收藏」

    Nginx负载均衡失效「建议收藏」1.配置upstreamtest_api_backend{server192.168.0.1:8080;server192.168.0.2:8080;server192.168.0.3:8080;session_stickycookie=test_web_route;}2.现象负载均衡失效,通过域名访问后请求总是打到同一台机器。3.原因使用了session_st

  • 谷歌离线地图包下载安卓版_谷歌地图 app

    谷歌离线地图包下载安卓版_谷歌地图 appGoogle离线地图发布文档一键离线地图发布(工具软件下载)  使用教程百度离线地图发布  教程 手机离线地图发布——Oruxmaps制作发布高清卫星离线地图谷歌离线地图发布API解析说明:1. 当前版本支持谷歌电子/卫星地图瓦片、高德地图、阿里云地图、超图、腾讯地图等(只需下载该地图源的瓦片拷贝到指定目录即可);2. 效果预览

  • 手机号归属地数据库;根据手机号查找对应的归属地;[通俗易懂]

    手机号归属地数据库;根据手机号查找对应的归属地;[通俗易懂]我在网上找到了一份手机号+对应归属地的数据库文档。链接:https://pan.baidu.com/s/1MQtDkw3sowNmdSeoVJUbEA密码:tp1o链接:https://pan.baidu.com/s/1pzh_FqXOP_6Ta103K5Cmyw密码:9j5r如有需要,先点赞、关注,再下载。…

  • IDEA使用ideaVim, 配置自定义vim快捷键[通俗易懂]

    IDEA使用ideaVim, 配置自定义vim快捷键[通俗易懂]C:\Users\Administrator文件夹下创建_ideavimrc,我这里用的是win系统需要安装ideaVim插件letmapleader=”sethlsearchsetincsearchsetignorecasesetsmartcasesetshowmodesetnumbersetrelativenumbersetscrolloff=…

发表回复

您的电子邮箱地址不会被公开。

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