1

我正在尝试创建一个二维数组,但我很困惑。一位同事告诉我,我需要在字典中为数组列表创建一个字典,但他无法留下来帮助我。

我已经能够创建列出这样的程序的第一个数组

+ 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 在会计期间循环,但它不起作用。我想我可能走在正确的轨道上,我希望 SO 可以提供一些指导,或者至少是一个教程供我学习。我已经在下面的第二个数组上发布了到目前为止我编写的代码。我正在使用 C# 和 MVC 3。您可能会注意到它们不是字典中的字典。如果我的同事是正确的,我将如何做这样的事情,我使用字典作为其他字典中的键来查看这个问题,但我不明白在这种情况下我将如何使用它。

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;
    } 

我希望我已经清楚地解释了我的问题,请随时要求任何需要的澄清,因为我需要解决这个问题,并且会经常回来查看。谢谢你的帮助!

4

3 回答 3

1

不要尝试使用匿名类型或 LINQ 投影来创建新的数据类型,尤其是如果您是初学者,您只会感到困惑。如果你想要一个专门的数据类型,定义一个;例如:

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);

这应该足以让你开始。

于 2012-08-29T16:51:23.610 回答
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
于 2012-08-29T17:45:51.340 回答
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 数据源提取到多维数组中的人。

于 2012-08-31T16:55:46.570 回答