我正在尝试创建一个二维数组,我感到很困惑。一位同事告诉我,我需要在字典中为数组列表创建一个字典,但他不能坚持帮助我。
我已经能够创建第一个列出像这样的程序的数组
+ project 1
+ project 2
+ project 3
+ project 4
完成此任务的代码位于 -
之下var PGList = from x in db.month_mapping
where x.PG_SUB_PROGRAM == SP
select x;
//select x.PG.Distinct().ToArray();
var PGRow = PGList.Select(x => new { x.PG }).Distinct().ToArray();
这样可以处理我的垂直数组,现在我需要添加我的水平数组,这样我就可以看到每个会计期间的总花费。所以最终输出看起来像这样,但当然没有破折号。
+ program 1-------100---200---300---400---500---600---700---800---900---1000---1100---1200
+ program 2-------100---200---300---400---500---600---700---800---900---1000---1100---1200
+ program 3-------100---200---300---400---500---600---700---800---900---1000---1100---1200
+ program 4-------100---200---300---400---500---600---700---800---900---1000---1100---1200
我曾尝试使用foreach来循环会计期间,但它不起作用。我想我可能走在正确的轨道上,我希望能够提供一些指导,或者至少是一个教程供我遵循。我已经在下面的第二个数组中发布了我写的代码。我正在使用C#和MVC 3.您可能会注意到它们不是字典中的字典。如果我的同事是正确的,我将如何做这样的事情,我看了一下这个问题using dictionary as a key in other dictionary,但我不明白我将如何在这种情况下使用它。
Dictionary<string, double[]> MonthRow = new Dictionary<string, double[]>();
double[] PGContent = new double[12];
string lastPG = null;
foreach (var item in PGRow)
{
if (lastPG != item.PG)
{
PGContent = new double[12];
}
var MonthList = from x in db.Month_Web
where x.PG == PG
group x by new { x.ACCOUNTING_PERIOD, x.PG, x.Amount } into pggroup
select new { accounting_period = pggroup.Key.ACCOUNTING_PERIOD, amount = pggroup.Sum(x => x.Amount) };
foreach (var P in MonthList)
{
int accounting_period = int.Parse(P.accounting_period) - 1;
PAContent[accounting_period] = (double)P.amount;
MonthRow[item.PG] = PGContent;
lastPG = item.PG;
}
我希望我已经清楚地解释了我的问题,请随时要求任何澄清,因为我需要解决这个问题,并且会经常回来查看。谢谢你的帮助!
答案 0 :(得分:1)
不要尝试使用匿名类型或LINQ投影来创建新的数据类型,特别是如果你是初学者,你会感到困惑。如果需要专门的数据类型,请定义一个; e.g:
public class Account
{
public string Name { get; private set; }
public decimal[] MonthAmount { get; private set; }
readonly int maxMonths = 12;
public Account(string name, ICollection<decimal> monthAmounts)
{
if (name == null)
throw new ArgumentNullException("name");
if (monthAmounts == null)
throw new ArgumentNullException("monthAmounts");
if (monthAmounts.Count > maxMonths)
throw new ArgumentOutOfRangeException(string.Format(" monthAmounts must be <= {0}", maxMonths));
this.Name = name;
this.MonthAmount = new decimal[maxMonths];
int i = 0;
foreach (decimal d in monthAmounts)
{
this.MonthAmount[i] = d;
i++;
}
}
}
直接使用此类型的实例,您不必将它们转换为数组,字典,列表或其他任何内容:
var accountPeriods = new List<Account>();
accountPeriods.Add(new Account("program-1", new decimal[] { 1, 2, 3, 4 }));
您可以使用LINQ或其他任何方法来查询或更改新类型的实例:
foreach (Account a in accountPeriods)
foreach (decimal d in a.MonthAmount)
DoSomethingWith(d);
这应该足以让你开始。
答案 1 :(得分:1)
希望这会有所帮助。
// sample data
var data = new Dictionary<string, List<int>>();
data.Add("program-1", new List<int>() { 100, 110, 130 });
data.Add("program-2", new List<int>() { 200, 210, 230 });
data.Add("brogram-3", new List<int>() { 300, 310, 330 });
// query data
var newData = (from x in data
where x.Key.Contains("pro")
select x).ToDictionary(v => v.Key, v=>v.Value);
// display selected data
foreach (var kv in newData)
{
Console.Write(kv.Key);
foreach (var val in kv.Value)
{
Console.Write(" ");
Console.Write(val.ToString());
}
Console.WriteLine();
}
输出是:
program-1 100 110 130
program-2 200 210 230
答案 2 :(得分:0)
我要感谢@Ray Cheng和@Dour High Arch的帮助,但我想出了另一种方法来完成这项任务,我想发布我的代码,以便下一个遇到同样麻烦的人可以搞清楚他们的问题更快。
上面我将我的代码分成更多可管理的部分,以尽可能清楚地解释我的问题,下面的代码将所有这些部分组合在一起,这样你就能看到全局。此代码返回一个包含程序和每月金额的数组。
public virtual ActionResult getAjaxPGs(string SP = null)
{
if (SP != null)
{
var PGList = from x in db.month_mapping
where x.PG_SUB_PROGRAM == SP
select x;
var PGRow = PGList.Select(x => new { x.PG }).Distinct().ToArray();
float[] PGContent = new float[12];
Dictionary<string,float[]> MonthRow = new Dictionary<string, float[]>();
foreach (var item in PGRow)
{
PGContent = new float[12];
var MonthList = from x in db.month_Web
where x.PG == item.PG
group x by new { x.ACCOUNTING_PERIOD, x.PG, x.Amount } into pggroup
select new { accounting_period = pggroup.Key.ACCOUNTING_PERIOD, amount = pggroup.Sum(x => x.Amount) };
foreach (var mon in MonthList)
{
int accounting_period = int.Parse(mon.accounting_period) - 1;
PGContent[accounting_period] = (float)mon.amount/1000000;
}
MonthRow[item.PG] = PGContent;
}
return Json(MonthRow, JsonRequestBehavior.AllowGet);
}
return View();
}
这段代码对我很有用,因为我从Linq转到SQL查询而不是直接在代码中添加数据。我的问题源于主要是将数据拉到foreach循环之外,所以它只从SQL中提取了1个数据而不是全部12个月。我希望这有助于其他一些试图将数据从SQL数据源提取到多维数组中的人。