如何比较Datatable和Array的月份之间的所有元素?
How to compare all elements between Datatable and Array's months?
想请教大家一个对你们有帮助的问题。
我有一个包含月份和金额的数据表,如下所示,还有一个以一年中所有月份命名的数组。我如何构建一个结构,该结构将 return 一年中的月份使用数据表中描述的数量以及其他月份的数量为零?
之前
Mes Qt
Dec 6
Jan 2
Nov 2
之后
Mes Qt
Jan 2
Fev 0
Mar 0
Abr 0
Mai 0
Jun 0
Jul 0
Ago 0
Set 0
Out 0
Nov 2
Dec 6
我的代码:
DataTable dt = new DataTable();
dt.Columns.Add("Data");
dt.Columns.Add("Quantidade");
dt.Rows.Add(new object[] { "Dec", 6 });
dt.Rows.Add(new object[] { "Jan", 1 });
dt.Rows.Add(new object[] { "Nov", 4 });
var monthsRange = Enumerable.Range(1, 12)
.Select(e => e > 0 ? Convert.ToDateTime("20/" + e + "/2000").ToString("MMM", CultureInfo.GetCultureInfo("en-US")) : "")
.ToArray();
我会使用类似的东西(我不确定要输出什么类型的数据):
DataTable initialData = new DataTable();
initialData.Columns.Add("Mes");
initialData.Columns.Add("Qt");
initialData.Rows.Add(new object[] { "Dec", 6 });
initialData.Rows.Add(new object[] { "Jan", 1 });
initialData.Rows.Add(new object[] { "Nov", 4 });
DataTable outputData = new DataTable();
outputData.Columns.Add("Mes");
outputData.Columns.Add("Qt");
foreach (var month in Enumerable.Range(1, 12))
{
var monthName = new DateTime(2000, month, 1).ToString("MMM", CultureInfo.GetCultureInfo("en-US"));
int.TryParse(initialData.Select($"Mes='{monthName}'").FirstOrDefault()?["Qt"].ToString(), out int count);
outputData.Rows.Add(new object[] { monthName, count });
}
假设您想要 List<anonymous>
的答案,那么我会将 DataTable
转换为 Dictionary
,然后使用 monthsRange
创建最终的 List
:
var monthsRange = Enumerable.Range(1, 12)
.Select(e => new DateTime(2000,e,20).ToString("MMM", CultureInfo.GetCultureInfo("en-US")))
.ToList();
var dtd = dt.AsEnumerable().ToDictionary(r => r.Field<string>("Data"), r => r.Field<string>("Quantidade"));
var ans = monthsRange.Select(Mes => new {
Mes,
Qt = dtd.TryGetValue(Mes, out var qt)
? qt
: "0"
})
.ToList();
想请教大家一个对你们有帮助的问题。
我有一个包含月份和金额的数据表,如下所示,还有一个以一年中所有月份命名的数组。我如何构建一个结构,该结构将 return 一年中的月份使用数据表中描述的数量以及其他月份的数量为零?
之前
Mes Qt
Dec 6
Jan 2
Nov 2
之后
Mes Qt
Jan 2
Fev 0
Mar 0
Abr 0
Mai 0
Jun 0
Jul 0
Ago 0
Set 0
Out 0
Nov 2
Dec 6
我的代码:
DataTable dt = new DataTable();
dt.Columns.Add("Data");
dt.Columns.Add("Quantidade");
dt.Rows.Add(new object[] { "Dec", 6 });
dt.Rows.Add(new object[] { "Jan", 1 });
dt.Rows.Add(new object[] { "Nov", 4 });
var monthsRange = Enumerable.Range(1, 12)
.Select(e => e > 0 ? Convert.ToDateTime("20/" + e + "/2000").ToString("MMM", CultureInfo.GetCultureInfo("en-US")) : "")
.ToArray();
我会使用类似的东西(我不确定要输出什么类型的数据):
DataTable initialData = new DataTable();
initialData.Columns.Add("Mes");
initialData.Columns.Add("Qt");
initialData.Rows.Add(new object[] { "Dec", 6 });
initialData.Rows.Add(new object[] { "Jan", 1 });
initialData.Rows.Add(new object[] { "Nov", 4 });
DataTable outputData = new DataTable();
outputData.Columns.Add("Mes");
outputData.Columns.Add("Qt");
foreach (var month in Enumerable.Range(1, 12))
{
var monthName = new DateTime(2000, month, 1).ToString("MMM", CultureInfo.GetCultureInfo("en-US"));
int.TryParse(initialData.Select($"Mes='{monthName}'").FirstOrDefault()?["Qt"].ToString(), out int count);
outputData.Rows.Add(new object[] { monthName, count });
}
假设您想要 List<anonymous>
的答案,那么我会将 DataTable
转换为 Dictionary
,然后使用 monthsRange
创建最终的 List
:
var monthsRange = Enumerable.Range(1, 12)
.Select(e => new DateTime(2000,e,20).ToString("MMM", CultureInfo.GetCultureInfo("en-US")))
.ToList();
var dtd = dt.AsEnumerable().ToDictionary(r => r.Field<string>("Data"), r => r.Field<string>("Quantidade"));
var ans = monthsRange.Select(Mes => new {
Mes,
Qt = dtd.TryGetValue(Mes, out var qt)
? qt
: "0"
})
.ToList();