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

2024-08-14 16:27:51 浏览数 (2)

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

1、通过字符串名称

2、通过整数“HashID”

代码语言:javascript复制
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都可不必加引号

代码语言:javascript复制
    static void Main()
    {
        Hashtable hs = new Hashtable();
        hs.Add("key", "value");
    }

方法二

代码语言:javascript复制
    static void Main()
    {
        Hashtable hs = new Hashtable();
        hs[1] = "one";
        hs["key"] = "value";
    }

B、移除某个键值对

HashtableObject.Remove(key);

代码语言:javascript复制
        hs.Remove(1);

C、移除所有元素

HashtableObject.Clear();

D、判断是否包含特定key

HashtableObject.Contains(Key);

Console.WriteLine()

代码语言:javascript复制
        Console.WriteLine(hs.Contains(1));

False

请按任意键继续. . .

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

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

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

实例:

代码语言:javascript复制
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的输出为空]),只有当检测到的类型声明为正确后,再输出哈希表数据

代码语言:javascript复制
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语句判断它是否是所需的类型,若是,则~,不是,则~

代码语言:javascript复制
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

代码语言:javascript复制
        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、遍历键、遍历值

代码语言:javascript复制
        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或从小到大的排序,但不能作为比较的第一个字符既有字母又有数字,无法排序

代码语言:javascript复制
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]);
        }
    }


}

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

0 人点赞