认真CS☀️Animator.StringToHash:字符串到哈希 & 哈希代码

在这里插入图片描述

 

当使用Unity的Animator时,如果要引用某个状态或者参数,有两种方法:

1、通过字符串名称

2、通过整数“HashID”

private int speedID=Animator.StringTohash("Speed");

    释义:从字符串“Speed”生成一个参数ID—“speedID”,ID用于参数的存储器优化(setters和getters)

    通过“HashID”更具有优势,不易出错,更高效

两种的使用方式不同,Unity的animation状态和parameters的字符串(Fag)需要通过对象使用;但“HashID”不需要,他是Animator的静态使用方法

哈希代码

键值对:指Name-value成对出现记录,例张三序号1,那么它的键值对就是:1-张三

哈希代码在C#中可以认为是HashTable(哈希表)类,这个类可以存储键值对

一、Name-value均为object类型,所以Hashtable可支持任何类型的Name-value键值对

二、什么时候使用哈希表HashTable:

1、某些数据会被高频率查询

2、数据量大

3、查询字段包含字符串类型

4、数据类型不唯一

三、哈希表使用方法

1、哈希表需要使用namespace

    using System.Collections;    //Console等命令还用到using System;空间

2、哈希表HashTable添加键值对

A、添加键值对

方法一:若是字母,Name和value必须加“”,若是数字,则Name-value都可不必加引号

    static void Main()
    {
        Hashtable hs = new Hashtable();
        hs.Add("key", "value");
    }

方法二

    static void Main()
    {
        Hashtable hs = new Hashtable();
        hs[1] = "one";
        hs["key"] = "value";
    }

B、移除某个键值对

HashtableObject.Remove(key);

        hs.Remove(1);

C、移除所有元素

HashtableObject.Clear();

D、判断是否包含特定key

HashtableObject.Contains(Key);

Console.WriteLine()

        Console.WriteLine(hs.Contains(1));

False

请按任意键继续. . .

E、用MessageBox.Show()展示哈希表中的Name-value

    注:此方法是在C#的Windows窗体应用—添加Windows窗体中才能使用!

          在其他代码不删除情况下,另添加Main方法

实例:

using System;
using System.Collections;
using System.Windows.Forms;

namespace ConsoleApp5
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        static void Main()
        {
            Hashtable hs = new Hashtable();
            hs[1] = "one";
            hs["key"] = "value";
            //      hs.Remove(1);
            //      hs.Clear();
            //      Console.WriteLine(hs.Contains(1));

            foreach (DictionaryEntry de in hs)
            {
                MessageBox.Show("key" + de.Key.ToString());
            }
        }
    }
}

F、当获取哈希表中数据时,如果类型声明的不对,在输出时会出现报错现象,若我们换种思路

1、使用as statement(如果为此类型,则给声明的参数赋值原值;若不是,则赋值null[null的输出为空]),只有当检测到的类型声明为正确后,再输出哈希表数据

using System;
using System.Collections;

class program
{
    public static void Main()
    {
        Hashtable ht = new Hashtable();
        ht.Add("北京","帝都");
        ht.Add(2,1);

        Console.WriteLine(ht.Contains("北京"));
        Console.WriteLine(ht.Contains("上海"));

        string value1 = ht["北京"] as string;
        string value2 = ht[2] as string;
        Console.WriteLine("\nvalue1="+value1+"   value2=" + value2);

        if (value1 != null)    //能转换成功
        {
            Console.WriteLine("\n这是由if生成:" + value1);
        }
        if (value2 == null)   //转换失败,value2值为null,但不会抛出异常
        {
            Console.WriteLine("name-2不是string类型\n");
        }
    }
}


PS:
安全性:
as操作符不会做过的转换操作,当需要转化对象的类型属于转换目标类型或者转换目标类型的派生类型时,
那么此转换操作才能成功,而且并不产生新的对象【当不成功的时候,会返回null】。因此用as进行类型
转换是安全的。
效率:
当用as操作符进行类型转换的时候,首先判断当前对象的类型,当类型满足要求后才进行转换,而传统的
类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,所以,相对来说,
as效率高点。
需要注意的是,不管是传统的还是as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功

2、或者使用is statement,先获取object值,再用if语句判断它是否是所需的类型,若是,则~,不是,则~

object value1=ht["北京"];
        if(value1 is string)
        {
            Console.WriteLine("这是字符串");
        }

        object value2 = ht[2];
        if (value2 is string)
        {
            Console.WriteLine("value2这是字符串");
        }
        else
        {
            Console.WriteLine("value2不是字符串");
        }

G、遍历哈希表DictionaryEntry Object

        foreach (DictionaryEntry de in ht)
        {
            Console.WriteLine("{0},{1}",de.Key, de.Value);
        } 

输出结果为单个(只输出key或value)可不加{0},{1},输出结果两个以上必须加上占位符{0},{1},否则会报错

de.Key和de.Value是Object,不可用连接符+,string类型等可用+(用了+即可不用占位符)

H、遍历键、遍历值

        foreach(Object key in ht.Keys)
        {
            Console.WriteLine(key);
        }

        foreach (Object key in ht.Values)
        {
            Console.WriteLine(key);
        }

Object可根据keys换成int、string等相应类型,也可是Object

I、对哈希表进行排序

可对纯字符串或者纯数字进行从a~z或从小到大的排序,但不能作为比较的第一个字符既有字母又有数字,无法排序

using System;
using System.Collections;

class program
{
    public static void Main()
    {
        Hashtable ht = new Hashtable();
        ht.Add("北京", "帝都");
        ht.Add("天津", 1);
        ht.Add("上海", 5);

        //ht.Add(1, "帝都");
        //ht.Add(3, 1);
        //ht.Add(2, 5);

        ArrayList aKeys = new ArrayList(ht.Keys);
        aKeys.Sort();
        foreach(Object key in aKeys)
        {
            Console.WriteLine(key + " : " + ht[key]);
        }
    }


}

大家还有什么问题,欢迎在下方留言!


 

在这里插入图片描述


如果你有 技术的问题 或 项目开发

都可以加下方联系方式

和我聊一聊你的故事🧡

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值