C# : 数字转文本 去尾零
C# : 数字转文本 去尾零
在C#中,如果你有一个数字并希望将其转换为文本并去除尾部的零,可以使用以下方法: ### 1. 使用 `ToString()` 和 `TrimEnd()` 假设你有一个浮点数,你可以将其转换为字符串,然后使用 `TrimEnd()` 去除尾部的零。 ```csharp double number = 123.4500; string result = number.ToString().TrimEnd('0').TrimEnd('.'); Console.WriteLine(result); // 输出: 123.45 ``` ### 2. 使用 `ToString("G29")` `ToString("G29")` 是一种格式化字符串的方法,它会自动去除不必要的尾部零。 ```csharp double number = 123.4500; string result = number.ToString("G29"); Console.WriteLine(result); // 输出: 123.45 ``` ### 3. 使用 `Regex` 去除尾部零 如果你需要更复杂的处理,可以使用正则表达式来去除尾部的零。 ```csharp using System.Text.RegularExpressions; double number = 123.4500; string result = Regex.Replace(number.ToString(), @"\.?0+$", ""); Console.WriteLine(result); // 输出: 123.45 ``` ### 4. 处理整数情况 如果数字是整数且没有小数部分,你可能希望保留整数部分而不显示小数点。 ```csharp double number = 123.000; string result = number.ToString("G29"); Console.WriteLine(result); // 输出: 123 ``` ### 总结 - `ToString().TrimEnd('0').TrimEnd('.')` 适用于简单的去除尾部零和小数点。 - `ToString("G29")` 是一种更简洁的方式,自动去除不必要的尾部零。 - 正则表达式适用于更复杂的场景。 根据你的需求选择合适的方法。
郭少锋
创建 2025-02-27 16:44:26
C#
C# : 简写:判断是否空值
C# : 简写:判断是否空值
你可以使用 **空合并运算符 (`??`)** 和 **空条件运算符 (`?.`)** 来简化代码。以下是简化后的版本: ### 简化后的代码 ```csharp var aFMaterialNo2 = this.Model.GetValue("F_PAEZ_OLDMTL", iRow)?.ToString() ?? ""; ``` ### 代码解析 1. **`?.` 空条件运算符**: - 如果 `this.Model.GetValue("F_PAEZ_OLDMTL", iRow)` 返回 `null`,则 `?.` 会直接返回 `null`,而不会调用 `ToString()` 方法,避免了 `NullReferenceException` 异常。 2. **`??` 空合并运算符**: - 如果 `?.` 的结果是 `null`,则 `??` 会返回其右侧的值(这里是空字符串 `""`)。 ### 对比原始代码 - 原始代码: ```csharp var aFMaterialNo_2 = this.Model.GetValue("F_PAEZ_OLDMTL", iRow); var aFMaterialNo2 = (aFMaterialNo_2 == null ? "" : aFMaterialNo_2.ToString()); ``` - 简化后的代码: ```csharp var aFMaterialNo2 = this.Model.GetValue("F_PAEZ_OLDMTL", iRow)?.ToString() ?? ""; ``` ### 优点 - 代码更简洁,减少冗余。 - 可读性更高,逻辑更清晰。 ### 注意事项 - 如果 `this.Model.GetValue` 返回的值可能不是 `null`,而是其他类型的空值(如 `DBNull`),则需要额外处理。例如: ```csharp var aFMaterialNo2 = (this.Model.GetValue("F_PAEZ_OLDMTL", iRow) as string) ?? ""; ```
郭少锋
创建 2025-02-26 15:05:46
C#
云星空 : char.IsWhiteSpace 是否为 空白字符
云星空 : char.IsWhiteSpace 是否为 空白字符
`char.IsWhiteSpace` 是 C# 中的一个静态方法,用于判断指定的字符是否为空白字符。空白字符包括空格、制表符、换行符等不可见字符。 ### 方法签名 ```csharp public static bool IsWhiteSpace(char c); ``` ### 参数 - `c`:要检查的字符。 ### 返回值 - 如果 `c` 是空白字符,返回 `true`;否则返回 `false`。 ### 支持的空白字符 `char.IsWhiteSpace` 方法支持的空白字符包括: - 空格 (`' '`) - 制表符 (`'\t'`) - 换行符 (`'\n'`) - 回车符 (`'\r'`) - 垂直制表符 (`'\v'`) - 换页符 (`'\f'`) - 以及其他 Unicode 空白字符(如 `\u00A0`、`\u2000` 等)。 ### 示例 ```csharp using System; class Program { static void Main() { char ch1 = ' '; char ch2 = '\t'; char ch3 = 'A'; Console.WriteLine(char.IsWhiteSpace(ch1)); // 输出: True Console.WriteLine(char.IsWhiteSpace(ch2)); // 输出: True Console.WriteLine(char.IsWhiteSpace(ch3)); // 输出: False } } ``` ### 总结 `char.IsWhiteSpace` 是一个实用的方法,常用于字符串处理中,用于检查字符是否为空白字符,从而进行相应的处理(如去除空白字符、分割字符串等)。
郭少锋
创建 2025-02-26 15:01:39
云星空
云星空 : List 创建 添加 排序
云星空 : List 创建 添加 排序
var aHead = this.Model.DataObject; // 单据头 var aEntity = aHead["Entity"] as DynamicObjectCollection; // 明细 var aEntitySum = aHead["F_EntitySum"] as DynamicObjectCollection; // 汇总信息 F_EntitySub var aEntityRpt = aHead["F_EntityRpt"] as DynamicObjectCollection; // 汇报信息 if (aEntitySum.Count == 0) { this.View.ShowErrMessage("【汇总信息】没有数据,无法分摊 !"); return; } #region| 取得:分摊清单 aList | var aList1 = new List<dynamic>(); // 分摊清单 var i = -1; foreach (var aRow1 in aEntitySum) { i++; var aFMaterialId = Convert.ToInt32( ((DynamicObject)aRow1["F_RVFJ_CLBM"])["Id"] ); // 材料编码 var aFUnitId = Convert.ToInt32( ((DynamicObject)aRow1["F_RVFJ_KCDW"])["Id"] ); // 单位 var aFSource = Convert.ToString(aRow1["F_Source2"]); // 数据来源 var aEntitySub = aRow1["F_EntitySub"] as DynamicObjectCollection; // 汇总来源 foreach (var aRow2 in aEntitySub) { var aFRowId = Convert.ToInt32(aRow2["F_RowId2"]); // 行标识 var aFAppQty = Convert.ToDecimal(aRow2["F_Qty1"]); // 申请数量 var aFActualQty = Convert.ToDecimal(aRow2["F_Qty2"]); // 分摊实耗数量 = 实发数量 dynamic aRow = new ExpandoObject(); aRow.Id = i + 1; // 顺序 aRow.F_RowId = aFRowId; // 行标识 aRow.F_Source1 = aFSource; // 数据来源 aRow.FMaterialId = aFMaterialId; // 物料编码 aRow.FUnitId = aFUnitId; // 单位 aRow.FAppQty = aFAppQty; // 申请数量 aRow.FActualQty = aFActualQty; // 实发数量 aList1.Add(aRow); } } var aList = aList1.OrderBy(x => x.F_Source1) // 排序 .ThenBy(x => x.F_RowId) .ThenBy(x => x.Id) .ToList(); #endregion
郭少锋
创建 2025-02-26 08:22:35
云星空
云星空 : List 排序
云星空 : List 排序
要对 `aList1` 进行排序,可以使用 `List<T>.Sort` 方法或 LINQ 的 `OrderBy` 方法。由于 `aList1` 是一个包含动态对象的列表,你可以根据动态对象的属性进行排序。 假设你想根据 `Id` 属性对 `aList1` 进行升序排序,可以使用以下代码: ### 使用 `List<T>.Sort` 方法 ```csharp aList1.Sort((x, y) => Comparer<int>.Default.Compare(x.Id, y.Id)); ``` ### 使用 LINQ 的 `OrderBy` 方法 ```csharp aList1 = aList1.OrderBy(x => x.Id).ToList(); ``` 如果你想根据多个属性进行排序,比如先按 `FMaterialId` 排序,再按 `FAppQty` 排序,可以使用以下代码: ### 使用 `List<T>.Sort` 方法 ```csharp aList1.Sort((x, y) => { int result = Comparer<int>.Default.Compare(x.FMaterialId, y.FMaterialId); if (result == 0) { result = Comparer<decimal>.Default.Compare(x.FAppQty, y.FAppQty); } return result; }); ``` ### 使用 LINQ 的 `OrderBy` 方法 ```csharp aList1 = aList1.OrderBy(x => x.FMaterialId).ThenBy(x => x.FAppQty).ToList(); ``` ### 示例代码 假设你想根据 `FMaterialId` 和 `FAppQty` 进行排序,完整的代码如下: ```csharp using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; public class Program { public static void Main() { var aList1 = new List<dynamic>(); // 分摊清单 var aEntitySum = new List<dynamic>(); // 假设这是你的数据源 var i = -1; foreach (var aRow1 in aEntitySum) { i++; var aFMaterialId = Convert.ToInt32(((DynamicObject)aRow1["F_RVFJ_CLBM"])["Id"]); // 材料编码 var aFUnitId = Convert.ToInt32(((DynamicObject)aRow1["F_RVFJ_KCDW"])["Id"]); // 单位 var aFSource = Convert.ToString(aRow1["F_Source2"]); // 数据来源 var aEntitySub = aRow1["F_EntitySub"] as DynamicObjectCollection; // 汇总来源 foreach (var aRow2 in aEntitySub) { var aFRowId = Convert.ToInt32(aRow2["F_RowId2"]); // 行标识 var aFAppQty = Convert.ToDecimal(aRow2["F_Qty1"]); // 申请数量 var aFActualQty = Convert.ToDecimal(aRow2["F_Qty2"]); // 分摊实耗数量 = 实发数量 dynamic newItem = new ExpandoObject(); newItem.Id = i + 1; // 顺序 newItem.F_RowId = aFRowId; // 行标识 newItem.F_Source1 = aFSource; // 数据来源 newItem.FMaterialId = aFMaterialId; // 物料编码 newItem.FUnitId = aFUnitId; // 单位 newItem.FAppQty = aFAppQty; // 申请数量 newItem.FActualQty = aFActualQty; // 实发数量 aList1.Add(newItem); } } // 使用 LINQ 进行排序 aList1 = aList1.OrderBy(x => x.FMaterialId).ThenBy(x => x.FAppQty).ToList(); // 或者使用 List.Sort 进行排序 aList1.Sort((x, y) => { int result = Comparer<int>.Default.Compare(x.FMaterialId, y.FMaterialId); if (result == 0) { result = Comparer<decimal>.Default.Compare(x.FAppQty, y.FAppQty); } return result; }); // 输出排序后的结果 foreach (var item in aList1) { Console.WriteLine($"Id: {item.Id}, FMaterialId: {item.FMaterialId}, FAppQty: {item.FAppQty}"); } } } ``` 在这个示例中,`aList1` 会根据 `FMaterialId` 和 `FAppQty` 进行排序。你可以根据需要调整排序的属性和顺序。
郭少锋
创建 2025-02-25 21:49:46
云星空
云星空 : DynamicObjectCollection 排序
云星空 : DynamicObjectCollection 排序
在 C# 中,`DynamicObjectCollection` 并不是一个内置类型,可能是你项目中自定义的集合类。假设它是一个动态对象的集合(例如 `List<dynamic>` 或 `List<ExpandoObject>`),我们可以通过 `LINQ` 对其进行排序。 以下是一个示例代码,展示如何对 `DynamicObjectCollection`(假设为 `List<dynamic>`)进行排序: --- ### **1. 按动态属性排序** 假设 `DynamicObjectCollection` 是一个 `List<dynamic>`,其中每个对象包含动态属性(如 `Name`、`Age` 等),我们可以通过 `LINQ` 对某个属性进行排序。 ```csharp using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; class Program { static void Main() { // 创建动态对象集合 var dynamicCollection = new List<dynamic> { new ExpandoObject(), new ExpandoObject(), new ExpandoObject() }; // 动态添加属性 dynamicCollection[0].Name = "John"; dynamicCollection[0].Age = 30; dynamicCollection[1].Name = "Alice"; dynamicCollection[1].Age = 25; dynamicCollection[2].Name = "Bob"; dynamicCollection[2].Age = 35; // 按 Name 属性排序 var sortedByName = dynamicCollection.OrderBy(x => x.Name).ToList(); // 输出排序结果 Console.WriteLine("Sorted by Name:"); foreach (var item in sortedByName) { Console.WriteLine($"{item.Name}, {item.Age}"); } // 按 Age 属性排序 var sortedByAge = dynamicCollection.OrderBy(x => x.Age).ToList(); // 输出排序结果 Console.WriteLine("\nSorted by Age:"); foreach (var item in sortedByAge) { Console.WriteLine($"{item.Name}, {item.Age}"); } } } ``` **输出结果**: ``` Sorted by Name: Alice, 25 Bob, 35 John, 30 Sorted by Age: Alice, 25 John, 30 Bob, 35 ``` --- ### **2. 降序排序** 如果需要降序排序,可以使用 `OrderByDescending` 方法: ```csharp // 按 Name 属性降序排序 var sortedByNameDesc = dynamicCollection.OrderByDescending(x => x.Name).ToList(); // 按 Age 属性降序排序 var sortedByAgeDesc = dynamicCollection.OrderByDescending(x => x.Age).ToList(); ``` --- ### **3. 处理动态属性的可能缺失** 如果某些动态对象可能没有指定的属性,可以使用 `TryGetMember` 或 `null` 检查来避免运行时异常: ```csharp var sortedByNameSafe = dynamicCollection .OrderBy(x => x.GetType().GetProperty("Name")?.GetValue(x, null) ?? "Unknown") .ToList(); ``` --- ### **4. 自定义排序逻辑** 如果需要更复杂的排序逻辑,可以使用 `IComparer` 或 `Comparison` 委托。例如: ```csharp var sortedByCustomLogic = dynamicCollection .OrderBy(x => x.Age, Comparer<int>.Create((a, b) => b.CompareTo(a))) // 按 Age 降序 .ThenBy(x => x.Name) // 然后按 Name 升序 .ToList(); ``` --- ### **5. 注意事项** - 动态对象的属性访问在运行时解析,因此需要确保属性存在,否则会抛出异常。 - 如果 `DynamicObjectCollection` 是你自定义的集合类,请确保它实现了 `IEnumerable` 接口,以便使用 `LINQ`。 如果你能提供更多关于 `DynamicObjectCollection` 的定义或用途,我可以进一步优化代码!
郭少锋
创建 2025-02-25 21:09:58
云星空
云星空 : c# Dictionary 排序
云星空 : c# Dictionary 排序
在C#中,如果你想对 `Dictionary<string, object>` 的键值对进行排序,可以使用 `LINQ` 来实现。以下是一个示例代码,展示如何按键(`Key`)或值(`Value`)对字典进行排序: --- ### **1. 按键(Key)排序** ```csharp using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { var aRow = new Dictionary<string, object> { { "Name", "John" }, { "Age", 30 }, { "City", "New York" }, { "Salary", 5000.50 } }; // 按键排序 var sortedByKey = aRow.OrderBy(kvp => kvp.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); // 输出排序结果 foreach (var item in sortedByKey) { Console.WriteLine($"{item.Key}: {item.Value}"); } } } ``` **输出结果**: ``` Age: 30 City: New York Name: John Salary: 5000.5 ``` --- ### **2. 按值(Value)排序** 如果值是 `object` 类型,需要先将其转换为可比较的类型(如 `int`、`double` 或 `string`)。以下是一个按值排序的示例: ```csharp using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { var aRow = new Dictionary<string, object> { { "Name", "John" }, { "Age", 30 }, { "City", "New York" }, { "Salary", 5000.50 } }; // 按值排序(假设值为数值类型) var sortedByValue = aRow.OrderBy(kvp => Convert.ToDouble(kvp.Value)).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); // 输出排序结果 foreach (var item in sortedByValue) { Console.WriteLine($"{item.Key}: {item.Value}"); } } } ``` **输出结果**: ``` Age: 30 Name: John City: New York Salary: 5000.5 ``` --- ### **3. 降序排序** 如果需要降序排序,可以使用 `OrderByDescending` 方法: ```csharp // 按键降序排序 var sortedByKeyDesc = aRow.OrderByDescending(kvp => kvp.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); // 按值降序排序 var sortedByValueDesc = aRow.OrderByDescending(kvp => Convert.ToDouble(kvp.Value)).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); ``` --- ### **4. 注意事项** - 如果字典中的值是复杂类型(如自定义对象),需要实现 `IComparable` 接口或使用自定义比较器。 - 排序后,`ToDictionary` 会生成一个新的字典,原始字典不会被修改。 希望这段代码对你有帮助!如果有其他问题,欢迎继续提问。
郭少锋
创建 2025-02-25 21:01:46
云星空
云星空 : C# 多个条件筛选
云星空 : C# 多个条件筛选
在C#中,若需为`DataTable`添加多个过滤条件,可通过`&&`(与)或`||`(或)逻辑运算符组合条件。以下是几种常见写法示例: ### 示例1:多条件“与”关系(同时满足) ```csharp var aTable2 = aTable1.AsEnumerable() .Where(row => row["F_RVFJ_CLBM"] != null && // 材料编码不为空 row["F_STATUS"].ToString() == "Active" && // 状态为"Active" Convert.ToInt32(row["F_QUANTITY"]) > 10 // 数量大于10 ) .ToList(); ``` ### 示例2:多条件“或”关系(满足其一) ```csharp var aTable2 = aTable1.AsEnumerable() .Where(row => row["F_RVFJ_CLBM"] == null || // 材料编码为空 或 row["F_STATUS"].ToString() == "Expired" // 状态为"Expired" ) .ToList(); ``` ### 示例3:混合使用“与”和“或” ```csharp var aTable2 = aTable1.AsEnumerable() .Where(row => (row["F_RVFJ_CLBM"] != null && row["F_TYPE"].ToString() == "A") || (Convert.ToDecimal(row["F_PRICE"]) < 100m) ) .ToList(); ``` ### 注意事项: 1. **类型安全**:推荐使用`Field<T>()`方法避免显式转换: ```csharp .Where(row => row.Field<string>("F_RVFJ_CLBM") != null && row.Field<string>("F_STATUS") == "Active" && row.Field<int>("F_QUANTITY") > 10 ) ``` 2. **处理DBNull**:若数据可能含`DBNull`,使用`IsNull`检查: ```csharp !row.IsNull("F_RVFJ_CLBM") ``` 3. **性能优化**:频繁查询可先转换为`Enumerable`: ```csharp aTable1.AsEnumerable().Where(...) ``` 根据实际需求调整条件组合方式即可。
郭少锋
创建 2025-02-25 17:57:10
云星空
云星空 : 用户授权了,看不到 发布的功能
云星空 : 用户授权了,看不到 发布的功能
启用多组织,选中一个组织,角色授权后,还需要批量授权给其他组织,才会生效。
郭少锋
创建 2025-02-21 16:54:06
云星空
SQL : SQL 排序编号
SQL : SQL 排序编号
,row_number() over ( order by FCustName,FDate,FBillNo,FIndex ) as FIdentityId -- 全部排序 ,rank() over( partition by a11.FID order by a12.FSeq ,a13.FSeq ) as FSort -- 分组排序 -- 1:创建临时表 DROP TABLE #table CREATE TABLE #table ([主管] NVARCHAR(50) ,[员工] NVARCHAR(50)) INSERT INTO #table VALUES (N'S 骚团长',N'张大') INSERT INTO #table VALUES (N'S 骚团长',N'张一') INSERT INTO #table VALUES (N'S 骚团长',N'张二') INSERT INTO #table VALUES (N'S 骚团长',N'张三') INSERT INTO #table VALUES (N'S 骚团长',N'张四') INSERT INTO #table VALUES (N'H 胡泽权',N'李大炮') INSERT INTO #table VALUES (N'H 胡泽权',N'李一炮') INSERT INTO #table VALUES (N'H 胡泽权',N'李二炮') INSERT INTO #table VALUES (N'H 胡泽权',N'李三炮') INSERT INTO #table VALUES (N'H 胡泽权',N'李四炮') INSERT INTO #table VALUES (N'L 李海平',N'王老大') INSERT INTO #table VALUES (N'L 李海平',N'王一') INSERT INTO #table VALUES (N'L 李海平',N'王二') INSERT INTO #table VALUES (N'L 李海平',N'王三') INSERT INTO #table VALUES (N'L 李海平',N'王四') --2:综合串起来分组查询编号、序号 SELECT ROW_NUMBER () OVER (ORDER BY [主管] ,[员工]) AS 总排序 ,DENSE_RANK () OVER (ORDER BY [主管] ) AS 主管排序 ,[主管] ,RANK() OVER(PARTITION BY [主管] ORDER BY [员工] ) AS 主管名下_员工排序 ,[员工] FROM #table (NOLOCK) WHERE [主管] IN (N'S 骚团长',N'H 胡泽权',N'L 李海平') ORDER BY [主管] --3:查询临时表 SELECT * FROM #table
郭少锋
编辑 2025-02-19 09:55:33
创建 2023-03-04 11:43:49
SQL