给自己看的unity知识点随手记(记录)

Transform

  • transform.localscale

扩大物体的x轴向0.1个单位

transform.localscale += new vector3(0.1f, 0, 0);
  • transform.Find

查找这个物体的子物体
find重载里面可以查找名字也可以是路径,名字的话只能查找到子物体,不能查找到孙物体,这种时候就要用路径,这里的用法和resource加载一样

transform.Find("Text");
transform.Find("Text/a");
  • 获取带有这个组件的子物体

GetComponentsInChildren 获取到带有这个组件的子物体

Button[] button = transform.GetComponentsInChildren<Button>();
  • 本地坐标转世界坐标

在能确定目标位置的情况下,将某一子物体移动到该位置。都可以通过tranform.TransformPoint与transform.InverseTransformPoint两步转换获得。

//目标物体相对于操作obj的世界坐标(trabsform.TransformPoint)
// targetTransform 目标位置
// selectTransform 操作物体位置
Vector3 v4 = targetTransform.transform.TransformPoint(selectTransform.localPosition);
Debug.Log(string.Format("目标obj相对于选择obj的世界坐标(TransformPoint):{0}", v4));
//操作目标的最终位置
Debug.Log(selectTransform.transform.InverseTransformPoint(v4));      

Math&Mathf

  • Mathf.log

对数级 log(2)2=1
log(2)10=log(2)2+log(2)5
在案例中发现,用此函数来控制等级和敌人数的关系

  // 以2为底10的对数,这个数字是在不停增加,但是趋势趋于平缓
  float num = Mathf.Log(10, 2); // num=3.321928
  • Math.Abs
// 绝对值
System.Math.Abs(-0.1f); //=0.1f
  • Mathf.FloorToInt

返回最大的整数,小于或等于f。

Debug.Log(Mathf.FloorToInt(10.0F)); // 10
Debug.Log(Mathf.FloorToInt(10.2F)); // 10
Debug.Log(Mathf.FloorToInt(10.7F)); 
Debug.Log(Mathf.FloorToInt(-10.2F)); // -11
  • Mathf.RoundToInt

四舍五入到最近的整数,但是有一点,如果最近的整数是偶数则返回偶数

Debug.Log(Mathf.RoundToInt(0.4f)); // 0
Debug.Log(Mathf.RoundToInt(0.5f)); // 0 最近的0和1,返回偶数0
Debug.Log(Mathf.RoundToInt(1.4f)); // 1 
Debug.Log(Mathf.RoundToInt(1.5f)); // 2
Debug.Log(Mathf.RoundToInt(-0.5f)); // 0
Debug.Log(Mathf.RoundToInt(-1.5f)); // -2
  • Mathf.Repeat

定义
public static float Repeat(float t,float length);
循环值t,使输出不会大于等于length,也不会小于0。

		//输入 012345678
        //输出 012012012
        for (int i = 0; i < 9; i++)
        {
            Debug.Log(Mathf.Repeat(i,3));
        }
  • Mathf.PingPong

定义
public static float PingPong(float t,float length);
循环值t,使输出不会大于length,也不会小于0。
返回值将在0和length之间来回移动。

        //输入012345678
        //输出012321012
        for (int i = 0; i < 9; i++)
        {
            Debug.Log(Mathf.PingPong(i,3));
        }


Vector

  • Vector3.MoveTowards

//表示以每秒moveMax的速度从Current移动到Target。
//因为Current和Target距离是4,所以当moveMax 等于0.5f,用时8秒,moveMax等于2时,用时2秒。

// 需要放在update等函数
transform.position = Vector3.MoveTowards(Current.position, Target.position, moveMax);
  • Vector3.Reflect

已知一个向量和一个法线,得其反射向量

Vector3 reflect = Vector3.Reflect(dir, Vector3.up);
  • 向量投影

unity有自带的
向量A对平面的投影 Vector3.ProjectOnPlane()
向量A对坐标轴标准向量的投影Vector3.Project()

Vector3.Project(向量A,Vector3.up)
Vector3.ProjectOnPlane(向量A,平面法向量)

获取字符串真实长度

string s="dawdawf 字体"
Dub.Log(System.Text.Encoding.Default.GetBytes(s).Length);

从数组中随机抽取一个数

简单随机抽取
先随机这个数组的长度,这个长度就是下标,直接输出数组这个下标的数就可以了

 			int[] arr = new int[6] { 2, 3, 4, 6, 7, 8 };
            int index = random.Next(arr.Length);
            int result= arr[index];

gameObject.activeInHierarchy

判断物体在场景中的显示状态

 if (!gameObjectt.activeInHierarchy)
    {
       // 物体在场景中隐藏
    }

gameObject.activeSelf

也是判断物体显示状态, 和上面的区别为
activeHierarchy可以理解为场景中的可见状态。如果某个对象在场景中不可见,对应的activeInHierarchy和activeSelf属性一定为false,而该对象的子物体的activeInHierarchy也为false,但是子物体的activeSelf属性却取决于自身的状态,不依赖于父对象。意思就是父物体被失活隐藏了,子物体跟着也隐藏了,但是子物体本身并没有被失活,所以他的activeSelf还是true

a??b

空合并运算符:??
用于定义可空类型和引用类型的默认值。如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。
例如:a??b 当a为null时则返回b,a不为null时则返回a本身。
空合并运算符为右结合运算符,即操作时从右向左进行组合的。如,“a??b??c”的形式按“a??(b??c)”计算。

int? a;
//a = null;
a = 6;//a不为空所以b返回的是a的值,如果a为空的话b返回3
int b = a ?? 3;
Debug.Log(b+"+++b");

PlayerPrefs

用于本地持久化保存与读取的类,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值
PlayerPrefs类支持3中数据类型的保存和读取,浮点型,整形,和字符串型。
分别对应的函数为:
SetInt();保存整型数据;
GetInt();读取整形数据;
SetFloat();保存浮点型数据;
GetFlost();读取浮点型数据;
SetString();保存字符串型数据;
GetString();读取字符串型数据;
这些函数的用法基本一致使用Set进行保存,使用Get进行读取。
用来本地缓存

PlayerPrefs.SetString("_NAME", set_NAME);
get_NAME=PlayerPrefs.GetString("_NAME"); 

int.TryParse

int.TryParse ,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,如果转换失败,输出值为 0
内容为 空格+数字或数字+空格 都可以输出该数字
内容为 数字+空格+数字 则转换失败
内容为 空 则转换失败

bool result = int.TryParse("1 2", out int temp);
Debug.Log(result ); // false
Debug.Log(temp); // 0

bool result = int.TryParse("1 ", out int temp);
Debug.Log(result ); // true
Debug.Log(temp); // 1

bool result = int.TryParse(" ", out int temp);
Debug.Log(result ); // false
Debug.Log(temp); // 0

object类型转换string

虽然挺基础的但是被卡住了一会,先记下来再说
要求是把object类型的value转换成int类型
两个参数用"+"连接起来,将两个参数分开

object value=1+","+3;
string data;
string a1 = value.ToString();
string[] data = a1.Split(',');
int data1 =int.Parse( data[0]);
int data2 =int.Parse( data[1]);
Debug.Log(data1+data2);

//简洁点
string[] a = value.ToString().Split(',');
Debug.Log(int.Parse(a[0]),int.Parse(a[1]));

有的时候类型转换会报错

异常 System.InvalidCastException: Specified cast is not valid.

//比如上面那个
int a=(int)value;
//这样写的话编译器不会报错,但是引擎会报上面那个异常
//看到了一个解决方案,这样ok
int a=Convert.ToInt32(value)

Trim()用法

去除一段文字中的首尾的空格

account_str = InpUsername.text.Trim();

DoTween的缩放和移动

1秒内缩放比例变化到1.5

transform.DOScale(new Vector3(1.5f, 1.5f), 1.0f);

两秒内移动到坐标(0,10,10)

transform.DOLocalMove(new Vector3(0, 10, 10), 2);

粒子系统播放速度

ParticleSystem.MainModule.simulationSpeed
控制粒子播放速度 ,之前的playbackSpeed unity已弃用

ParticleSystem particle;
particle = gameObject.GetComponent<ParticleSystem>();
var main = particle.main;
main.simulationSpeed = 0.5f; // 播放速度为0.5倍

粒子系统缩放

ParticleSystem.MainModule.simulationSpeed
控制粒子缩放 ,之前的startSize unity已弃用

ParticleSystem particle;
particle = gameObject.GetComponent<ParticleSystem>();
var main = particle.main;
main.startSize= 3f; // 放大为原来的三倍

unity判断当前平台

判断当前平台是编译器还是安卓或者iOS平台
分别执行不同的方法

#if UNITY_EDITOR || PLATFORM_STANDALONE
        Debug.Log("这是编译器");
#elif UNITY_ANDROID
        Debug.Log("这是安卓平台");
#elif UNITY_IOS
		Debug.Log("这是iOS平台");
#endif

时间戳

计算当前时间

	// 获取到从1970年1月1号0点0分
    static readonly DateTime DateTime197008 = new DateTime(1970, 1, 1,8,0,0);
    public static long GetDateStamp
    {
        get
        {
            TimeSpan ts = new DateTime(DateTime.UtcNow.Year,DateTime.
                UtcNow.Month,DateTime.UtcNow.Day,0,0,0) - DateTime197008;
            return Convert.ToInt64(ts.TotalSeconds);
        }
    }

iOS和unity交互

iOS向unity发送消息
HallPanel是 C#脚本名,也可以用物体名
LoginInit是具体的方法名称
uername是需要传的值

UnitySendMessage("HallPanel", "LoginInit", uername); 

unity调用iOS方法

    public static class IOSSDK1
    {
        // 注册按钮的点击。在 xcode 中可以实现这个按钮点击后的事件
        [DllImport("__Internal")]
        static extern void _PressButton111();// 这是iOS程序的方法名
        public static void ActivateButton111()
        {
            if (Application.platform != RuntimePlatform.OSXEditor)
            {
                点击按钮后调⽤用 iOS 中实现的 _PressButton111 ()⽅方法,
                _PressButton111();
            }
        }
    }

画一条两点间的直线

先在物体上加一个line Renderer组件,获取到起始点和终点的坐标,如下的方法就可以画出一条两点间的直线

 public Transform line2Start, line2End;
 public LineRenderer line;

 void Update()
 {
    line.SetPosition(0, line2Start.position);
    line.SetPosition(1, line2End.position);
 }

检测InputField输入法是否处于点击状态

为true时表示鼠标或者手指点击了input输入框,输入法处于打开状态

input.isFocused

修改RectTransform的值

改变RectTransform的top和right ,注意这里的属性是负的!比如这里给了个(1,1),呈现的结果则是(-1,-1)

GetComponent<RectTransform>().offsetMax = new Vector2(-right, -top);

改变RectTransform的bottom和left

GetComponent<RectTransform>().offsetMin = new Vector2(left, bottom);

三元运算符的简单应用

本来是会用的,但是乍一看还是理了一会,还是理解的不到位,先记下吧
意思是如果I=3的话 next的值为0,如果I≠3的话,next始终比I大一位,
例如I=0,则next=1,以此类推

int next = i == 3 ? 0 : i + 1;

向量叉乘

判断点是否在线上或者点和线的关系
公式 x₁y₂-x₂y₁ 结果=0的话点在线上,大于0小于0则是在线的上下方

查看运行日志

C:\Users\HP\AppData\Local\Unity\Editor\Editor.log
一般是在这个文件夹,长这样,这就可以看一下自己的包体都是被什么占用了或者unity打印台在这里插入图片描述
在这里插入图片描述

单例

简单记录一下

public class Player
{
    private Player() { }
    private static Player _Instance;
    public static Player Instance
    {
        get
        {
            if (_Instance == null)
            {
                _Instance = new Player();
            }
            return _Instance;
        }
    }
}

Text文本修改RGB颜色

#+RGB代码

Color nowColor;
ColorUtility.TryParseHtmlString("#FECEE1", out nowColor);

dropDown下拉组件

dropDown.value是当前选框内显示的选项

  dropdown.onValueChanged.AddListener(dropDownChange);
  void dropDownChange(int index)
    {
        int scene = 0;
        switch (index)
        {
            case 0:
                scene = 1;
                break;
            case 1:
                scene = 2;
                break;
            case 2:
                scene = 3;
                break;
        }
   }
 

整理一波小技巧

  1. 如果编辑器意外崩溃了,但场景未保存,这时可以打开工程目录,找到/Temp/_Backupscenes/文件夹,可以看到有后缀名为.backup的文件,将该文件的后缀名改为.unity拖拽到项目视图,即可还原编辑器崩溃前的场景。
  2. 在场景中选中某个对象,按F键会将该对象聚焦到屏幕中心,但在移动该对象时镜头并不会跟随。如果按两次F键,或者按Shift+F键,即让镜头跟着该对象后面移动
  3. 检视面板中所有的颜色字段都是支持复制和粘贴的,只需右键点击颜色字段既可选择操作。
  4. 从项目视图点击右键创建的脚本会自动填充一些代码。其实这些自动填充的代码模板也是可以自定义的。
    如果使用Mac,找到应用程序中的Unity.app,右键单击显示包内容,找到Resources>ScriptTemplates文件夹,然后选择你要创建模板的脚本类型,复制一份自己命名并编辑后保存,然后退出编辑器之后重新打开,再在项目视图中右键单击创建,就会出现刚刚添加的脚本类型。打开新建的脚本就可以看到自定义的模板代码。
    如果使用Windows,则在ProgramFiles(x86)或ProgramFiles目录下的Unity/Data/Resources/ScriptTemplates文件夹下进行同样的操作即可。
  5. 如果喜欢物体可以紧贴地面,但倾斜角度不好调整,这时可以在物体上添加Mesh Collider和Rigidbody组件,然后点击运行,借助Unity的物体引擎来计算位置。待物体坠落到地面后复制所有物体,停止运行后删除原先的物体再粘贴运行时复制的内容,并删除所有物体上的Mesh Collider和Rigidbody组件即可。
  6. 如果需要拼合两个物体,可以自己分别在两个物体上创建立方体当作锚点,按住V键进入顶点选择模式,然后选择锚定立方体上需要拼合的两个顶点,即可将物体无缝拼接在一起。
    如果需要旋转物体,可以按下Cmd/Ctrl键后用鼠标操作旋转,这样可以让物体每次固定旋转15度,最终转到正确位置。
  7. 在float型的字段前添加范围属性声明如[Range(0, 10)],即可在检视面板中使用滑动条来设置该字段的值。
  8. 对一组字段使用属性声明[Header(“XX”)],可以在检视面板中将字段进行分组
  9. 如果常常不小心进入播放模式后编辑场景内容,其实可以依次点击菜单项Edit > Preferences > Colors > Playmode设置编辑器在进入播放模式后的颜色,与正常模式下明显区分开来
  10. 将鼠标聚焦于编辑器内的某个窗口,按住Shift+空格键,可以将该窗口最大化至编辑器范围或者还原为原先大小
  11. 矩形工具(T)也可以用来操作3D物体

富文本编辑

加粗 Hello
斜体 Hello
字号 <size=50>Hello
颜色 <color=#ff000000>指定RGB的16进制值 <color=red>指定颜色名称
如 再充<size=25><color=yellow>20元,即可升级

不规则碰撞器

unity自带 PolygonCollider2D

在这里插入图片描述
效果如图,三角形设置三个点,五边形设置五个点以此类推可以做出复杂碰撞器
在这里插入图片描述

获取碰撞器Collision 碰撞面的法线

     private void OnCollisionEnter2D(Collision2D collision)
    {
        // 获取碰撞物体的碰撞面的法线向量
        foreach (ContactPoint2D contact in collision.contacts)
        {
            Vector3  dir = contact.normal;
        }
    }

获取到图片转码Base64

string base64String = System.Convert.ToBase64String(Texture.EncodeToPNG())

动态调整文本框高度

  //先给text赋完值
  text.rectTransform.sizeDelta = new Vector2(text.rectTransform.sizeDelta.x, text.preferredHeight);

通过网络链接获取json

    void Start()
    {
        StartCoroutine(getJson());
    }
    string link = "你的链接";

    IEnumerator getJson()
    {
        WWW www = new WWW(link);
        yield return www;
        Debug.Log(www.text);
    }

发布exe调整宽高

#if PLATFORM_STANDALONE
        Screen.fullScreen = false;
        // 这里设置分辨率
        Screen.SetResolution(1334, 750, false);
#endif

打开系统浏览器

        string url= "https://fanyi.baidu.com/?aldtype=16047#auto/zh";
        // PC端系统默认浏览器
        System.Diagnostics.Process.Start(url);
        // 移动端默认浏览器
        WWW www = new WWW(url);
        Application.OpenURL(www.url);

Text文本放大不清晰

将Text的FontSize调大,Scale调小即可
反过来的话会又大又模糊

字号放大效果
在这里插入图片描述
缩放效果
在这里插入图片描述

Resources.UnloadUnusedAssets

此API 不能释放AB包中的东西,只能释放从AB包中加载出的资源,也可以释放场景的资源

彩色Debug

Debug.Log(string.Format("<color=red>{0}</color>", "hello world"));

代码控制unity暂停

EditorApplication.isPaused = true;

Debug画线

Debug.DrawLine(起点,方向,颜色)

Debug.DrawLine(transform.position, Vector.up, Color.yellow);

协程的开关

对于无参协程,可以直接使用StartCoroutine(方法名)StopCoroutine(方法名)来开启关闭
但是对于带参的协程,上面的关闭方法就不可用了,要使用一下方法

	// 定义一个协程来接收方法
    IEnumerator temp;
    private void Awake()
    {
        temp = tests(5);
        // 开启
        StartCoroutine(temp);
    }
    // 每秒打印一个数字,到3的时候停止
    IEnumerator tests(int a)
    {
        while (a > 0)
        {
            a--;
            yield return new WaitForSeconds(1);
            Debug.Log(a);
            if (a == 3)
            {	
            	// 关闭
                StopCoroutine(temp);
            }
        }
    }

修改VS脚本模板

unity安装目录/Editor/Data/Resources/ScriptTemplates/81-C# Script-NewBehaviourScript.cs.txt

Array返回具有value的第一个元素的索引

返回数组tempArray中value为2的第一个索引

  int[] tempArray=new int[]{0,1,2,0,1,2};
  int index = Array.IndexOf(tempArray, 2);
  // index=2;

判断射线检测是否点击到UI

#if UNITY_EDITOR || PLATFORM_STANDALONE
            if (EventSystem.current.IsPointerOverGameObject())
            {
                return;
            }
#else
            if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
                return;
#endif

Toggle的onValueChanged绑定的事件会触发两次

原因是这个方法本来就是值改变的时候触发,也就是说bool从true的时候触发一次变成false又触发一次,
解决方法是在绑定的事件里添加一个返回,这样就只在true的时候触发

// 示例代码
	ToggleProps.onValueChanged.AddListener(this.changeShowByToggle);
    void changeShowByToggle(bool a = false)
    {
        if (!a)
            return;
        Debug.Log("触发");   
	}

动态更换天空盒

	// material为要换的天空盒材质球
	RenderSettings.skybox = material;

禁止多点触控

  Input.multiTouchEnabled = false;

Json序列化

百度找了一大圈,试了各种方法和格式转换,最后还是用了Newtonsoft.Json插件

string json = JsonConvert.SerializeObject(Dic);

解析Json数组[非json格式]

使用Newtonsoft.Json插件
JsonUtility太轻量化,不能解析json数组

List<Dictionary<string, string>> resultCacheList = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(json);

整数相除得小数

整数相除得到的是整数,但是浮点数和整数相除得到的就是浮点数

Debug.Log(1284 * 1.0f / 800 * 1.0f); // 1.605f

获取系统权限

可以自行设置权限

public const string Camera = "android.permission.CAMERA";
public const string Microphone = "android.permission.RECORD_AUDIO";
public const string FineLocation = "android.permission.ACCESS_FINE_LOCATION";
public const string CoarseLocation = "android.permission.ACCESS_COARSE_LOCATION";
public const string ExternalStorageRead = "android.permission.READ_EXTERNAL_STORAGE";
public const string ExternalStorageWrite = "android.permission.WRITE_EXTERNAL_STORAGE";
//  检查现在是否有权限
if (!Permission.HasUserAuthorizedPermission(Permission.Microphone))
{
    // 申请录音权限
    Permission.RequestUserPermission(Permission.Microphone);
}
// 注意,如果在用户点了"不再询问我",权限申请的弹窗不会弹出,但是`Permission.HasUserAuthorizedPermission`方法仍可以判断,可以在后面使用功能之前再次判断是否有权限

网络加载图片后进行压缩

Texture.Compress(true);
防止内存溢出

UnityWebRequest www = UnityWebRequestTexture.GetTexture(url);
Texture2D myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture;
myTexture.Compress(true);

手机震动

Handheld.Vibrate()


// 隔一秒震动一次
float timer = 1f;
void update(){
    if(timer >0){
        timer -= Time.deltaTime;
    }else{
        timer = 1f;
        Handheld.Vibrate();
    }
}

获取路径

Path.Combine(xxx)

Path.Combine(Application.dataPath + "/Texture/test");
Path.Combine(Application.streamingAssetsPath+ "/test");

小数转为百分数

xx.ToString(“P”)
xx.ToString(“0%”)

 string n = 0.21f.ToString("P");   // n=21.00%
 string n = 0.21f.ToString("0%");  // n=21%

世界坐标转视口坐标

直接获取UI位于这个屏幕的位置

// 获得屏幕坐标  世界坐标转屏幕坐标
Vector3 pos = Camera.main.WorldToViewportPoint(target.transform.position);
Vector2 uguiPos = Vector2.zero;
// 屏幕坐标获得的是位于屏幕的比例,计算一下得到位置
uguiPos.x = (pos.x - 0.5f) * Screen.width;;
uguiPos.y = (pos.y - 0.5f) * TScreen.height;
// 需要注意的是父物体的缩放会影响最终坐标所以需要处理一下
uguiPos /= transform.parent.localScale.x;

// 使用
RectTransform startPos =start.GetComponent<RectTransform>();
startPos.anchoredPosition = uguiPos;

判断设备网络是流量还是wifi

switch (Application.internetReachability)
{
    case NetworkReachability.NotReachable:
        Debug.Log("当前网络不可用");
        break;
    case NetworkReachability.ReachableViaCarrierDataNetwork:
        Debug.Log("当前网络为3g/4g");
        break;
    case NetworkReachability.ReachableViaLocalAreaNetwork:
        Debug.Log("当前网络为Wifi");
        break;
    default:
        break;
}

编辑模式下执行代码

[ExecuteAlways]
在编辑模式下也执行代码

[ExecuteAlways]
public class test : MonoBehaviour
{
}

查询List下数据重复次数

using System.Linq;

// 将重复数据转为list
var result = list.GroupBy(x => x).Where(g => g.Count() > 1).Select(y => y.Key).ToList();
// 将重复数据转为字典
var result = list.GroupBy(x => x ).ToDictionary(x => x.Key,x=>x.Count());

var result = list.GroupBy(x => x).Where(g => g.Count() > 1);
// 直接获取重复次数,如{1,2,3,4}则输出0
// {1,1,2,3},输出1
// {1,1,2,2,3} 输出2
Debug.Log(result.Count());

将字节转为其他单位(MB,GB,TB)

    public string FormatBytes(long bytes)
    {
        string[] Suffix = { "Byte", "KB", "MB", "GB", "TB" };
        int i = 0;
        double dblSByte = bytes;
        if (bytes > 1024)
            for (i = 0; (bytes / 1024) > 0; i++, bytes /= 1024)
                dblSByte = bytes / 1024.0;
        return string.Format("{0:0.##}{1}", dblSByte, Suffix[i]);
    }

List中排序

Reverse 简单逆序,直接把列表反过来
list.Sort((a, b) => b.CompareTo(a)); 用sort从大到小排序
list = list.Distinct().ToList(); 去重

        List<int> list = new List<int> { 202309, 202310, 202309, 202310, 202309,202311 };
        // 逆序
        // 202311, 202309, 202310, 202309, 202310,202309
        list.Reverse(); 
        // 再根据数值大小从大到小排序
        // 202311, 202310, 202310, 202309, 202309,202309
        list.Sort((a, b) => b.CompareTo(a));
        // 202311, 202310,202309
        list = list.Distinct().ToList(); 

Dictionary中排序

		// o => o.Key 是一个lambda表达式,表示排序的依据是字典的key
		// 按照key值从大到小降序排列
		dic.OrderByDescending(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
        // 按照key值从小到大升序排列
        dic.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
        // o => o.Value 是一个lambda表达式,表示排序的依据是字典的key
		// 按照Value值从大到小降序排列
		dic.OrderByDescending(o => o.Value).ToDictionary(o => o.Key, p => p.Value);
        // 按照Value值从小到大升序排列
        dic.OrderBy(o => o.Value).ToDictionary(o => o.Key, p => p.Value);
		
		// 保留原字典的key   对值进行降序排序
		var sort = dic.ToDictionary(entry => entry.Key, entry => entry.Value.OrderByDescending(s => s));
		// 保留原字典的value   对key进行降序排序
		var sortedPairs = dic.OrderByDescending(entry => entry.Key);
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值