### C# 算法汇总
#### 一、判断是否为数字
在 C# 编程语言中,经常需要检查用户输入或数据流中的字符串是否为数字。这可以通过多种方式实现,下面展示了一种简单的检查方法。
```csharp
private bool IsNumeric(string str)
{
if (str == null || str.Length == 0)
return false;
System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding();
byte[] bytestr = ascii.GetBytes(str);
foreach (byte c in bytestr)
{
if (c < 48 || c > 57)
return false;
}
return true;
}
```
**解析:**
1. **函数定义**:`IsNumeric` 方法接收一个字符串 `str` 作为参数,并返回一个布尔值表示该字符串是否仅由数字组成。
2. **空检查**:首先检查传入的字符串是否为空或长度为零,如果是,则直接返回 `false`。
3. **ASCII 编码转换**:使用 `ASCIIEncoding` 将字符串转换成字节数组。这种方式较为传统,现代做法更倾向于使用 `char.IsDigit()` 方法。
4. **遍历检查**:遍历每个字节,通过比较其 ASCII 值来确定字符是否为数字。数字的 ASCII 值范围是 48-57。
5. **返回结果**:如果所有字符都为数字,则返回 `true`;否则返回 `false`。
#### 二、序列化与反序列化
序列化是将对象的状态保存为一系列字节的过程,以便可以在以后的时间点恢复这些状态。在 C# 中,有两种常见的序列化方式:二进制序列化和 XML 序列化。下面介绍如何使用二进制序列化实现序列化和反序列化。
**示例代码**:
```csharp
[Serializable]
public class MyObject
{
public int n1 = 0;
public int n2 = 0;
public string str = null;
}
// 序列化
MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "一些字符串";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
// 反序列化
IFormatter deserializer = new BinaryFormatter();
Stream streamRead = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject objDeserialized = (MyObject)deserializer.Deserialize(streamRead);
streamRead.Close();
```
**解析:**
1. **类定义**:使用 `[Serializable]` 属性标记类 `MyObject` 以表明它可以被序列化。
2. **序列化过程**:
- 创建 `BinaryFormatter` 实例。
- 创建用于写入的 `FileStream`。
- 调用 `BinaryFormatter` 的 `Serialize` 方法,传入 `FileStream` 和要序列化的对象。
- 关闭流。
3. **反序列化过程**:
- 创建 `BinaryFormatter` 实例。
- 创建用于读取的 `FileStream`。
- 调用 `BinaryFormatter` 的 `Deserialize` 方法,传入 `FileStream`。
- 关闭流。
4. **注意事项**:
- 二进制序列化效率高且生成的字节流紧凑。
- 在反序列化过程中不会调用构造函数。
- 开发人员在标记类为可序列化时需要考虑到这一点。
#### 三、身份证号码验证
身份证号码验证是一种常见的应用场景,尤其在中国等国家和地区。下面是一个简单的身份证号码验证算法。
```csharp
public static bool CheckIDCard(string IDCard, string strBirthDay)
{
string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
string[] Checker = ("1,9,8,7,6,5,4,3,2,1,1").Split(',');
int intLength = IDCard.Length;
int i = 0, TotalmulAiWi = 0;
int modValue = 0;
string strVerifyCode = "";
string Ai = "";
string BirthDay = "";
int intYear = 0;
int intMonth = 0;
int intDay = 0;
if (intLength < 15 || intLength == 16 || intLength == 17 || intLength > 18)
return false;
if (intLength == 18)
{
Ai = IDCard.Substring(0, 17);
// ...后续逻辑处理
}
// 其他逻辑
}
```
**解析:**
1. **初始化参数**:定义了一系列用于验证的数组。
2. **长度检查**:验证身份证号码的长度是否合法,有效长度包括 15、16 或 18 位。
3. **18位号码处理**:
- 提取前 17 位数字。
- 后续逻辑处理将涉及计算校验码等步骤。
以上提供了三种不同的 C# 算法实例,涵盖了字符串处理、序列化/反序列化以及特定场景下的验证逻辑。这些算法在实际应用中非常实用,可以帮助开发者高效地解决问题。
评论0
最新资源