2017-03-14 8 views
-1

同じフィールド(方向フィールド - コードを見て)を持つ要素のグループをリストから取り出して、リスト内の最初の項目を取得したいmyListの注文)、それがOKであるかどうかを確認し、それを取る。同じフィールドフォームリストを持つC#takeグループ

次に、次の方向(存在する場合)を取り、グループを作成して最初の要素を取ります。

どの段階でどのくらいのグループになるのかわかりません。私はそれが最大4グループになることを知っています。これどうやってするの?

List <myClass> myList = allCreatedObjects; 

class myClass 
{ 
    Control c; 
    Direction d; 
} 

public enum Direction 
{ 
    up, down, right, left, 
} 
+1

少なくとも、もしあれば "foreach"を試してみましたか? – Fabio

答えて

0

あなたはrightを選択する例えば、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() }; 
+0

それは私の問題を解決した、助けをありがとう! –

0
List<myClass> myList = new List<myClass> 
{ 
    new myClass(){c = new Button(), d = Direction.down }, 
    new myClass(){c = new Button(), d = Direction.left }, 
    new myClass(){c = new Button(), d = Direction.right }, 
    new myClass(){c = new Button(), d = Direction.up }, 
    new myClass(){c = new TextBox(), d = Direction.down }, 
    new myClass(){c = new TextBox(), d = Direction.left }, 
    new myClass(){c = new TextBox(), d = Direction.right }, 
    new myClass(){c = new TextBox(), d = Direction.up }, 
}; 

public class myClass 
{ 
    public Control c; 
    public Direction d; 
} 

public enum Direction 
{ 
    up, down, right, left, 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    var groups = myList.GroupBy(my => my.d); 
    var firstElems = groups.Select(g => g.FirstOrDefault()).ToList(); 
} 
1

。あなたが方向別にグループ化したい場合は、各方向でいくつかの条件をチェックし、次のように試してみてください:

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> 
//... 
関連する問題