使用嵌套的foreach将一个foreach值存储到数组中

时间:2014-05-02 01:15:48

标签: c# asp.net arrays foreach

好吧所以我真的不知道怎么说这个问题,但我尽了最大努力。我想要实现的目标是使用foreach循环遍历类别。在foreach循环类别中,另一个foreach循环将通过Numbers。现在它正在抓取表中的任何值并将它们存储到数组中。我的目标是只将每个类别中最高的数字存储到数组中。

以下是表格的外观:

Category Table  

Title        NumberId

Type            1
Priority        2
Likelihood      3

Numbers Table

Order        NumberId
  3              1
  2              1
  1              1
  3              2
  2              2
  1              2
  3              3
  2              3
  1              3

所以我的目标不是将每个订单值存储到数组中。我想根据每个数字ID存储最高的数字。所以数组将包含3,3,3。

这就是我将每个数字存储到数组中的原因:

int[] values = new int[count];

foreach(var x in Category)
{
   foreach(var w in x.Numbers)
   {
      values[y] = w.Order;
      y++;
   }
}

解决方案:

int[] values = new int[count];

foreach(var x in Category)
{
   foreach(var w in x.Numbers)
   {
       values[y] = x.Numbers.Select(o => o.Order).Max();
       y++;
       break;
    }
}

2 个答案:

答案 0 :(得分:1)

这可以通过LINQ相对轻松地完成:

int[] values = new int[count];

foreach(var x in Category)
{
    values.[y] = x.Numbers.OrderBy(w => w.Order).Reverse().First();
    y++;
}

按顺序对x.Numbers进行排序,反转顺序(在顺序中放置最高值),然后选择第一个值。

使用此方法确保您实际获得了x.Number的值,否则您将获得.First()调用抛出的异常。

如果您无法使用LINQ(例如,如果您使用的是.NET 2.0),请考虑使用以类别为键的词典,并使用最高的数字作为值:

Dictionary<int, int> categoriesByHighestOrders = new Dictionary<int, int>();
foreach(var x in Category)
{
    if (!categoriesByHighestOrders.Keys.Contains[x.SomeIndetifier])
        categoriesByHighestOrders.Add(x.SomeIdentifier, 0);
   foreach(var w in x.Numbers)
   {
        if (categoriesByHighestOrders[x.SomeIndetifier] < w.Order
            categoriesByHighestOrders[x.SomeIndetifier] = w.Order;
   }
}

答案 1 :(得分:1)

您可以使用IEnumerable.Max()

foreach(var x in Category)
{
    values[y] = x.Numbers.Select(o => o.Order).Max();
    y++;
}