3

我有一个包含 8 个元素的列表:

ConfigFile.ControllerList

此列表是以下类型:

List<Controller>

如何将 ControllerList 中的控制器添加到 3 个字典键。字典就像:

Dictionary<int, List<Controller>> ControllerDictionary = new Dictionary<int, List<Controller>>();

我想将前 3 个控制器添加到字典键 0,然后想将接下来的 3 个控制器添加到字典键 1,最后想将最后 2 个控制器添加到字典键 2。我该怎么做?

4

2 回答 2

4

您可以使用/将列表拆分为子列表:

var ControllerDictionary = ControllerList
    .Select((c, i) => new { Controller = c, Index = i })
    .GroupBy(x => x.Index / maxGroupSize)
    .Select((g, i) => new { GroupIndex = i, Group = g })
    .ToDictionary(x => x.GroupIndex, x => x.Group.Select(xx => xx.Controller).ToList());

这个想法是首先按索引对元素进行分组,然后将它们除以intmaxGroupSize(在您的情况下为 3)。然后将每个组转换为列表。

于 2013-05-17T08:37:00.793 回答
1

不确定是否有更优雅的解决方案,但这样的事情应该可以工作:

var dict = new Dictionary<int, List<Controller>>();

int x = 0;
while (x < controllerList.Count)
{
   var newList = new List<Controller> { controllerList[x++] };

   for (int y = 0; y < 2; y++) // execute twice
      if (x < controllerList.Count)
         newList.Add(controllerList[x++]);

   dict.Add(dict.Count, newList);
}

为了使其更通用,您还可以创建newList空白以开始,然后更改y < 2y < GROUP_SIZEGROUP_SIZE想要的任何大小的组。甚至可以将其提取到扩展方法中:

public static Dictionary<int, List<T>> ToGroupedDictionary<T>
   (this IList<T> pList, int pGroupSize)
{
   var dict = new Dictionary<int, List<T>>();

   int x = 0;
   while (x < pList.Count)
   {
      var newList = new List<T>();

      for (int y = 0; y < pGroupSize && x < pList.Count; y++, x++)
         newList.Add(pList[x]);

      dict.Add(dict.Count, newList);
   }

   return dict;
}

然后你可以这样做:

var groups = new[]
{
   "Item1",
   "Item2",
   "Item3",
   "Item4",
   "Item5",
   "Item6",
   "Item7",
   "Item8"
}.ToGroupedDictionary(3);
于 2013-05-17T08:37:50.470 回答