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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL安装配置教程(超级详细、保姆级)

    MySQL安装配置教程(超级详细、保姆级)一、下载MySQLMysql官网下载地址https://downloads.mysql.com/archives/installer/1.选择想要安装的版本,本篇文章选择的是5.7.31版本,下面的那个文件,点击Download下载二、安装MySQL1.选择设置类型双击运行mysql-installer-community-5.7.31.0.msi这里选择是自定义安装,所以直接选择“Custom”,点击“Next”“DeveloperDefault”是开发者默认

    2022年5月31日
    44
  • 启发式算法(Heuristic Algorithm)

    启发式算法(Heuristic Algorithm)启发式算法是一种技术,这种技术使得在可接受的计算成本内去搜寻最好的解,但不一定能保证所得的可行解和最优解,甚至在多数情况下,无法阐述所得解同最优解的近似程度。Heuristics可以等同于:实际经验

    2022年7月2日
    31
  • 安装tensorflow GPU版本–tensorflow-gpu版本与CUDA版本对应关系(持续更新,目前到TF2.7)「建议收藏」

    安装tensorflow GPU版本–tensorflow-gpu版本与CUDA版本对应关系(持续更新,目前到TF2.7)「建议收藏」一、WIndows安装GPU版本tensorflow注意一下几个问题一般就不会出错(1)确定自己要安装哪个版本的tensorflow-gpu;(1)根据自己要装的tensorflow-gpu版本确定要下载的CUDA版本;(2)根据要安装的CUDA版本确定要下载的Cudnn版本。二、tensorflow-gpu版本与CUDA版本对应关系不同版本的tensorflow-gpu与CUDA对应关…

    2022年5月16日
    560
  • idea 2021.9最新激活码 mac[最新免费获取]

    (idea 2021.9最新激活码 mac)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL…

    2022年3月27日
    68
  • Android原生系统真的那么好用吗?安卓原生系统吊打其他系统,因为有Google-Play

    Android原生系统真的那么好用吗?安卓原生系统吊打其他系统,因为有Google-PlayAndroid原生系统真的那么好用吗?这种问题当然是否定的。原生Android(指的是直接基于AOSP构建的而非手机厂商出厂固件修改的第三方ROM,但包括Nexus/Pixel或其它被Google直接支持的手机的可能是闭源的出厂固件)对于适合的人而言是无可替代的,当前几乎无任何定制ROM就与之相比。但是对于更多的中国用户而言,他们从一开始就使用的是定制系统,已经习惯了那一套逻辑和对系统的认知,所以定制系统是更好的选择(但您们最好祈祷一下手机厂商的ROM不要越来越不要脸)。当然.

    2022年6月19日
    83
  • 下拉框Html.DropDownList 和DropDownListFor 的经常用法

    下拉框Html.DropDownList 和DropDownListFor 的经常用法

    2021年12月3日
    46

发表回复

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

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