文章目录
- Transform
- Math&Mathf
- Vector
- 从数组中随机抽取一个数
- gameObject.activeInHierarchy
- gameObject.activeSelf
- a??b
- PlayerPrefs
- int.TryParse
- object类型转换string
- 有的时候类型转换会报错
- Trim()用法
- DoTween的缩放和移动
- 粒子系统播放速度
- 粒子系统缩放
- unity判断当前平台
- 时间戳
- iOS和unity交互
- 画一条两点间的直线
- 检测InputField输入法是否处于点击状态
- 修改RectTransform的值
- 三元运算符的简单应用
- 向量叉乘
- 查看运行日志
- 单例
- Text文本修改RGB颜色
- dropDown下拉组件
- 整理一波小技巧
- 富文本编辑
- 不规则碰撞器
- 获取碰撞器Collision 碰撞面的法线
- 获取到图片转码Base64
- 动态调整文本框高度
- 通过网络链接获取json
- 发布exe调整宽高
- 打开系统浏览器
- Text文本放大不清晰
- Resources.UnloadUnusedAssets
- 彩色Debug
- 代码控制unity暂停
- Debug画线
- 协程的开关
- 修改VS脚本模板
- Array返回具有value的第一个元素的索引
- 判断射线检测是否点击到UI
- Toggle的onValueChanged绑定的事件会触发两次
- 动态更换天空盒
- 禁止多点触控
- Json序列化
- 解析Json数组[非json格式]
- 整数相除得小数
- 获取系统权限
- 网络加载图片后进行压缩
- 手机震动
- 获取路径
- 小数转为百分数
- 世界坐标转视口坐标
- 判断设备网络是流量还是wifi
- 编辑模式下执行代码
- 查询List下数据重复次数
- 将字节转为其他单位(MB,GB,TB)
- List中排序
- Dictionary中排序
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;
}
}
整理一波小技巧
- 如果编辑器意外崩溃了,但场景未保存,这时可以打开工程目录,找到/Temp/_Backupscenes/文件夹,可以看到有后缀名为.backup的文件,将该文件的后缀名改为.unity拖拽到项目视图,即可还原编辑器崩溃前的场景。
- 在场景中选中某个对象,按F键会将该对象聚焦到屏幕中心,但在移动该对象时镜头并不会跟随。如果按两次F键,或者按Shift+F键,即让镜头跟着该对象后面移动
- 检视面板中所有的颜色字段都是支持复制和粘贴的,只需右键点击颜色字段既可选择操作。
- 从项目视图点击右键创建的脚本会自动填充一些代码。其实这些自动填充的代码模板也是可以自定义的。
如果使用Mac,找到应用程序中的Unity.app,右键单击显示包内容,找到Resources>ScriptTemplates文件夹,然后选择你要创建模板的脚本类型,复制一份自己命名并编辑后保存,然后退出编辑器之后重新打开,再在项目视图中右键单击创建,就会出现刚刚添加的脚本类型。打开新建的脚本就可以看到自定义的模板代码。
如果使用Windows,则在ProgramFiles(x86)或ProgramFiles目录下的Unity/Data/Resources/ScriptTemplates文件夹下进行同样的操作即可。- 如果喜欢物体可以紧贴地面,但倾斜角度不好调整,这时可以在物体上添加Mesh Collider和Rigidbody组件,然后点击运行,借助Unity的物体引擎来计算位置。待物体坠落到地面后复制所有物体,停止运行后删除原先的物体再粘贴运行时复制的内容,并删除所有物体上的Mesh Collider和Rigidbody组件即可。
- 如果需要拼合两个物体,可以自己分别在两个物体上创建立方体当作锚点,按住V键进入顶点选择模式,然后选择锚定立方体上需要拼合的两个顶点,即可将物体无缝拼接在一起。
如果需要旋转物体,可以按下Cmd/Ctrl键后用鼠标操作旋转,这样可以让物体每次固定旋转15度,最终转到正确位置。- 在float型的字段前添加范围属性声明如[Range(0, 10)],即可在检视面板中使用滑动条来设置该字段的值。
- 对一组字段使用属性声明[Header(“XX”)],可以在检视面板中将字段进行分组
- 如果常常不小心进入播放模式后编辑场景内容,其实可以依次点击菜单项Edit > Preferences > Colors > Playmode设置编辑器在进入播放模式后的颜色,与正常模式下明显区分开来
- 将鼠标聚焦于编辑器内的某个窗口,按住Shift+空格键,可以将该窗口最大化至编辑器范围或者还原为原先大小
- 矩形工具(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);