C#以相同的字段表单列表获取组

C#以相同的字段表单列表获取组,c#,.net,C#,.net,我想从一个列表中获取一组具有相同字段(方向字段-查看代码)的元素,然后获取列表中出现的第一项(myList顺序),检查if和take是否正确 接下来,我想采取下一个方向(如果存在),创建一个组,然后再次采取第一个元素 我不知道每一步会有多少组。我只知道这将是最大4组。我该怎么做 List <myClass> myList = allCreatedObjects; class myClass { Control c; Direction d; } public enum

我想从一个列表中获取一组具有相同字段(方向字段-查看代码)的元素,然后获取列表中出现的第一项(myList顺序),检查if和take是否正确

接下来,我想采取下一个方向(如果存在),创建一个组,然后再次采取第一个元素

我不知道每一步会有多少组。我只知道这将是最大4组。我该怎么做

List <myClass> myList = allCreatedObjects;

class myClass
{
  Control c; 
  Direction d;
}

public enum Direction
{
  up, down, right, left,
}
List myList=allCreatedObjects;
类myClass
{
对照组c;
方向d;
}
公共枚举方向
{
上,下,右,左,
}

您可以使用
linq
,例如选择
右键

var rightGroup = myList.Where(c => c.d == Direction.right);
如果要对所有枚举值自动执行此操作,可以使用如下循环:

foreach (Direction direction in Enum.GetValues(typeof(Direction)))
{
    var groupList = myList.Where(c => c.d == direction);
}
这将导致几个变量

您也可以像这样使用linq:

var group = from item in myList
            group item by item.d into g
            select new { key = g.Key, listItems = g.ToList() };
这将生成一个以方向为键的对象,并用项目填充listItems。如果要为未添加的方向创建空列表,则需要使用方向枚举联接

至于一个更奇特的例子:

var group = from item in myList
            where item.d == Direction.left //some condition on item
            group item by item.d into g
            where g.Any(c => c.d == Direction.up) //some condition on the group
            select new { key = g.Key, values = g.ToList() };
List myList=新列表
{
新建myClass(){c=new Button(),d=Direction.down},
新建myClass(){c=new Button(),d=Direction.left},
新建myClass(){c=new Button(),d=Direction.right},
新建myClass(){c=new Button(),d=Direction.up},
新建myClass(){c=new TextBox(),d=Direction.down},
新建myClass(){c=new TextBox(),d=Direction.left},
新建myClass(){c=new TextBox(),d=Direction.right},
新建myClass(){c=new TextBox(),d=Direction.up},
};
公共类myClass
{
公共控制c;
公共指示d;
}
公共枚举方向
{
上,下,右,左,
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
var groups=myList.GroupBy(my=>my.d);
var firstElems=groups.Select(g=>g.FirstOrDefault()).ToList();
}

我不确定你到底想要什么。但如果要按方向分组,则在每个方向上检查某些条件,您可以尝试以下操作:

var output = new Dictionary<Direction, List<myClass>>();

foreach (myClass cls in myList)
{
    //check some condition based on cls properties 
    if (cls.c is TextBox && cls.d != Direction.down)
    {
        output[cls.d].Add(cls); //add it to output
    }
}

//each item in output[direction] is of type List<myClass>
var upList = output[Direction.up]; //this is as List<myClass>
//var downList = output[Direction.down]; //this is as List<myClass>
//...
var输出=新字典();
foreach(myList中的myClass cls)
{
//根据cls属性检查某些条件
if(cls.c是文本框&&cls.d!=Direction.down)
{
输出[cls.d].Add(cls);//将其添加到输出
}
}
//输出[方向]中的每个项目都是列表类型
var upList=输出[方向向上]//这是一份清单
//var downList=输出[方向向下]//这是一份清单
//...

有什么努力吗?您是否使用
if。。至少还有别的吗?
var output = new Dictionary<Direction, List<myClass>>();

foreach (myClass cls in myList)
{
    //check some condition based on cls properties 
    if (cls.c is TextBox && cls.d != Direction.down)
    {
        output[cls.d].Add(cls); //add it to output
    }
}

//each item in output[direction] is of type List<myClass>
var upList = output[Direction.up]; //this is as List<myClass>
//var downList = output[Direction.down]; //this is as List<myClass>
//...