个人博客 用于记载日常收集的一些技术文章 ...
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