【发布时间】:2016-04-29 07:34:22
【问题描述】:
我坚持将一个巨大的 if 链转换为字典。在旧版解决方案中,Excel 导出是这样完成的:
foreach (DataRow dr in fullData.Rows)
{
DataRow newRow = dt.NewRow();
foreach (DataColumn dc in dt.Columns)
{
String s = dc.Caption;
if (s.Equals("ID"))
newRow[dc] = dr["id"];
else if (s.Equals("PQ-Nr"))
newRow[dc] = dr["pqNummer"];
else if (s.Equals("GJ"))
newRow[dc] = dr["geschaeftsjahr"];
else if (s.Equals("Link"))
newRow[dc] = dr["link"];
/*more complex example*/
else if(s.Equals("GF"))
{
string content = "";
int intVal = 0;
if (Int32.TryParse(dr["id"].ToString(), out intVal))
{
List<Freigabe> liste = DBHelper.getFreigabenByPersonalTyp(intVal, Personal.GF);
foreach (Freigabe f in liste)
{
//build content string here
}
}
newRow[dc] = content.TrimEnd();
}
/*plus around 60 more else if statements*/
}
dt.Rows.Add(newRow);
}
return dt;
我的想法是将规则和实际分配的行分成两部分。所以我创建了一个字典:
var rules = new Dictionary<Func<string, bool>, Func<DataRow, object>>()
{
{y => y == "ID", x => x["id"] },
{y => y == "PQ-Nr", x => x["pqNummer"] },
//....
};
为了获取当前列值,我执行以下操作:
foreach (DataRow dr in fullData.Rows)
{
DataRow newRow = dt.NewRow();
foreach (DataColumn dc in dt.Columns)
{
String s = dc.Caption;
newRow[dc] = from r in rules
where r.Key(s)
select r.Value(dr);
}
dt.Rows.Add(newRow);
}
return dt;
完成报告中每个单元格的内容现在是:System.Linq.Enumerable+WhereSelectEnumerableIterator2[System.Collections.Generic.KeyValuePair2[System.Func2[System.String,System.Boolean],System.Func2[System.Data.DataRow,System.Object]],System.Object],而不是它的价值。
我到底做错了什么?
【问题讨论】:
-
您的 linq 部分
newRow[dc] = from r in rules where r.Key(s) select r.Value(dr);可以返回多个值。只需将结果限制为 1。 -
天哪。我现在还没有把头撞在桌子上。想要将此添加为答案?
标签: c# linq dictionary datatable