foreach (IGrouping<string, DataRow> apcrows in apcResult) { if (apcrows.ToArray().CopyToDataTable().Rows[0]["PMName"].ToString()==pm) { apctable = apcrows.ToArray().CopyToDataTable(); break; } 请简化以上代码 }
时间: 2024-02-10 16:17:33 浏览: 114
以下是代码的简化版本:
```
apctable = apcResult.FirstOrDefault(x => x.ToArray().CopyToDataTable().Rows[0]["PMName"].ToString() == pm)?.ToArray().CopyToDataTable();
```
这里使用了 `FirstOrDefault()` 方法来查找符合条件的第一个 `IGrouping`。如果找到了,那么就使用 `ToArray()` 方法将其转换为 `DataRow[]` 数组,然后使用 `CopyToDataTable()` 方法将其转换为 `DataTable` 对象并赋值给 `apctable` 变量。如果没找到,则返回 `null`,此时使用 null 条件运算符 `?.` 来避免空引用异常。
相关问题
优化这串代码using Oracle.ManagedDataAccess.Client; public static OracleDbType ConvertOracleDbType(Type type) { switch(type.Name.ToLower()) { case "decimal": return OracleDbType.Decimal; case "string": return OracleDbType.Varchar2; case "datetime": return OracleDbType.Date; default: return OracleDbType.Varchar2; } } public static dynamic InitList(Type type) { switch(type.Name.ToLower()) { case "decimal": return new List<decimal>(); case "string": return new List<string>(); case "datetime": return new List<DateTime>(); default: return new List<string>(); } } public static void AddValue(dynamic list, Type type, object value) { switch(type.Name.ToLower()) { case "decimal": list.Add(Convert.ToDecimal(value)); break; case "string": list.Add(Convert.ToString(value)); break; case "datetime": list.Add(Convert.ToDateTime(value)); break; default: list.Add(Convert.ToString(value)); break; } } public static int BulkCopy(DataTable dataTable) { string connStr = ""; int result = 0; List<string> sql_column = new List<string>(); List<string> sql_para = new List<string>(); List<OracleParameter> paras = new List<OracleParameter>(); foreach(DataColumn column in dataTable.Columns) { sql_column.Add(column.ColumnName); sql_para.Add(":" + column.ColumnName); dynamic list = InitList(column.DataType); foreach(DataRow dr in dataTable.Rows) { AddValue(list, column.DataType, dr[column]); } OracleParameter para = new OracleParameter(column.ColumnName, ConvertOracleDbType(column.DataType)); para.Value = list.ToArray(); paras.Add(para); } using(var connection = new OracleConnection(connStr)) { connection.Open(); string sql = $"insert into {dataTable.TableName}({string.Join(",", sql_column)}) values ({string.Join(",", sql_para)})"; OracleCommand cmd = new OracleCommand(sql, connection); cmd.Parameters.AddRange(paras.ToArray()); cmd.ArrayBindCount = dataTable.Rows.Count; result = cmd.ExecuteNonQuery(); connection.Close(); } return result; }
以下是可以优化的几点:
1. 在每个方法内部都使用了 switch 语句,可以将其封装成一个字典,避免每次都进行判断。
2. InitList 方法中每个 case 的返回值类型都是相同的,可以直接将返回值类型写在方法签名中,避免使用 dynamic。
3. 在 AddValue 方法中,default 分支中的类型应该与 InitList 方法中的对应类型一致。
4. 在 BulkCopy 方法中,使用了多个 List 来存储数据,可以考虑使用字典或者自定义的类来存储,使代码更加简洁易懂。
5. 连接字符串 connStr 并没有赋值,需要在实际应用中进行赋值。
6. 在 using 语句中打开了连接,在执行完 SQL 后应该使用 using 语句自动关闭连接,避免出现连接泄露的问题。
优化后的代码如下:
```
using Oracle.ManagedDataAccess.Client;
public static class OracleHelper
{
private static readonly Dictionary<string, OracleDbType> TypeDict = new Dictionary<string, OracleDbType>()
{
{"decimal", OracleDbType.Decimal},
{"string", OracleDbType.Varchar2},
{"datetime", OracleDbType.Date}
};
public static OracleDbType ConvertOracleDbType(Type type)
{
string typeName = type.Name.ToLower();
return TypeDict.ContainsKey(typeName) ? TypeDict[typeName] : OracleDbType.Varchar2;
}
public static List<T> InitList<T>()
{
if (typeof(T) == typeof(decimal))
{
return new List<T>() as List<T>;
}
else if (typeof(T) == typeof(string))
{
return new List<T>() as List<T>;
}
else if (typeof(T) == typeof(DateTime))
{
return new List<T>() as List<T>;
}
else
{
return new List<T>() as List<T>;
}
}
public static void AddValue<T>(List<T> list, object value)
{
if (typeof(T) == typeof(decimal))
{
list.Add(Convert.ToDecimal(value));
}
else if (typeof(T) == typeof(string))
{
list.Add(Convert.ToString(value));
}
else if (typeof(T) == typeof(DateTime))
{
list.Add(Convert.ToDateTime(value));
}
else
{
list.Add(Convert.ToString(value) as T);
}
}
public static int BulkCopy(DataTable dataTable)
{
string connStr = ""; // 这里需要替换为实际的连接字符串
int result = 0;
List<string> sql_column = new List<string>();
List<string> sql_para = new List<string>();
Dictionary<string, List<object>> dataDict = new Dictionary<string, List<object>>();
foreach (DataColumn column in dataTable.Columns)
{
sql_column.Add(column.ColumnName);
sql_para.Add(":" + column.ColumnName);
List<object> list = InitList<object>();
foreach (DataRow dr in dataTable.Rows)
{
AddValue(list, dr[column]);
}
dataDict.Add(column.ColumnName, list);
}
using (var connection = new OracleConnection(connStr))
{
connection.Open();
string sql = $"insert into {dataTable.TableName}({string.Join(",", sql_column)}) values ({string.Join(",", sql_para)})";
OracleCommand cmd = new OracleCommand(sql, connection);
foreach (var kvp in dataDict)
{
OracleParameter para = new OracleParameter(kvp.Key, ConvertOracleDbType(dataTable.Columns[kvp.Key].DataType));
para.Value = kvp.Value.ToArray();
cmd.Parameters.Add(para);
}
cmd.ArrayBindCount = dataTable.Rows.Count;
result = cmd.ExecuteNonQuery();
}
return result;
}
}
```
序列化datarow
要序列化 DataRow,你可以使用 DataSet 和 DataTable。下面是一个示例:
```csharp
using System;
using System.Data;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
// 创建一个 DataTable 并添加一些数据
DataTable dataTable = new DataTable("MyDataTable");
dataTable.Columns.Add("Id", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
dataTable.Rows.Add(1, "John");
dataTable.Rows.Add(2, "Jane");
// 将 DataTable 序列化成字节数组
byte[] serializedData;
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream())
{
binaryFormatter.Serialize(memoryStream, dataTable);
serializedData = memoryStream.ToArray();
}
// 将字节数组反序列化成 DataTable
DataTable deserializedDataTable;
using (MemoryStream memoryStream = new MemoryStream(serializedData))
{
deserializedDataTable = (DataTable)binaryFormatter.Deserialize(memoryStream);
}
// 打印反序列化后的 DataTable 数据
foreach (DataRow row in deserializedDataTable.Rows)
{
Console.WriteLine($"Id: {row["Id"]}, Name: {row["Name"]}");
}
```
在上面的示例中,我们首先创建了一个 DataTable 并添加了一些数据。然后,我们使用 BinaryFormatter 将 DataTable 序列化为字节数组,并使用 MemoryStream 进行操作。接下来,我们使用相同的 BinaryFormatter 将字节数组反序列化为 DataTable。最后,我们遍历反序列化后的 DataTable 并打印出其中的数据。
请注意,在实际应用中,你可能需要处理序列化和反序列化过程中的异常,并根据需要进行错误处理。
希望这可以帮助到你!如果你有任何其他问题,请随时提问。
阅读全文