2017-09-22 15 views
0

名前のリストを取得して配列に追加し、その配列をN個のグループに分割し、それらの配列をWindowsフォームの別々のテキストボックスに表示したいとします。これまで私はこれを持っています。これはリストを取り、それらを分割しますが、正直言って、私はそれが私がしたいことをやっているとは思いません。アレイをより小さな配列に分割するにはどうすればよいですか?

MasterList:

ジョニー、マーク、トム、カール、ジェニー、スージー、ベン、ティム、アンジー

グループ1:ジョニー、マーク、アンジー

グループ2:トム、カール

グループ3:ジェニー、スージー

グループ4:ベン、ティム

void addnamestoList_Click(object sender, EventArgs e) 
{ 
    if (string.IsNullOrWhiteSpace(this.studentnameTboxContent)) 
    { 
     int num = (int)MessageBox.Show("No content to format.", 
        "Message", 
        MessageBoxButtons.OK, 
        MessageBoxIcon.Exclamation); 
    } 
    else 
    { 
     transformText(); 
    } 
} 

public void transformText() 
{ 
    string[] masterList = studentnameTboxContent.Split('\n'); 
    var split = from index in Enumerable.Range(0, masterList.Length) 
     group masterList[index] by index/int.Parse(groupcountTboxContent); 

    studentNames.Text = ""; 
    foreach (var Array in split) 
    { 
     studentNames.AppendText(string.Join(Environment.NewLine, Array.ToArray())); 
    } 
} 

はリストをランダム化する方法:

private string[] randomizeList(string[] list) 
     { 
      Random rnd = new Random(); 
      string[] randomList = list.OrderBy(x => rnd.Next()).ToArray(); 

      return randomList; 
     } 
+1

?たとえば、ソースの短いサンプルとそのリストをどのようにグループ化するかの簡単なサンプルを説明できますか?提供されたサンプルからあまり明確ではない – DiskJunky

+0

投稿を更新しました。 – jPol34

+0

これは役に立ちます。あなたはどのような名前がどのグループに入るかをどのように決めていますか? – DiskJunky

答えて

1

ここでそれを行うための一つの方法ですが、それは非常にエレガントではありません。基本的には、ユーザーが入力したグループ数に基づいてグループサイズを計算し、各グループに含めるアイテムの数を決定し、最初のリストに追加する必要がある残りのアイテムの数を決定します(グループをカウント)。

次に、ループで、これまでに取り込んだアイテムの数をスキップしてから、グループサイズのアイテムを取り出し、さらに追加する必要があるアイテムがまだ残っている場合は、リスト:このコードは簡単にint型を抽出することができ

var masterList = new List<string> 
{ 
    "Johnny", "Mark", "Tom", "Carl", 
    "Jenny", "Susie", "Ben", "Tim", "Angie"    
}; 

var groupCount = 4; // Entered by the user 

var minGroupSize = masterList.Count/groupCount; 
var extraItems = masterList.Count % groupCount; 

var groupedNames = new List<List<string>>(); 

for (int i = 0; i < groupCount; i++) 
{ 
    groupedNames.Add(masterList.Skip(i * minGroupSize).Take(minGroupSize).ToList()); 

    if (i < extraItems) 
    { 
     groupedNames[i].Add(masterList[masterList.Count - 1 - i]); 
    } 
} 

Console.WriteLine("Here are the groups:"); 
for(int index = 0; index < groupedNames.Count; index++) 
{ 
    Console.WriteLine($"#{index + 1}: {string.Join(", ", groupedNames[index])}"); 
} 

Console.Write("\nDone!\nPress any key to exit..."); 
Console.ReadKey(); 

出力

enter image description here


Oの方法は、それが他の場所で再利用できるように:

static List<List<string>> GetGroups(List<string> masterList, int groupCount) 
{ 
    var groups = new List<List<string>>(); 

    // Argument validation. All of these conditions should be true. 
    if (masterList != null && groupCount > 0 && groupCount <= masterList.Count) 
    { 
     var minGroupSize = masterList.Count/groupCount; 
     var extraItems = masterList.Count % groupCount; 

     for (int i = 0; i < groupCount; i++) 
     { 
      groups.Add(masterList.Skip(i * minGroupSize).Take(minGroupSize).ToList()); 

      if (i < extraItems) 
      { 
       groups[i].Add(masterList[masterList.Count - 1 - i]); 
      } 
     } 
    } 

    return groups; 
} 

使い方あなたがによってそれらをグループ化しているもの

var masterList = new List<string> 
{ 
    "Johnny", "Mark", "Tom", "Carl", "Jenny", 
    "Susie", "Ben", "Tim", "Angie" 
}; 

var groupedNames = GetGroups(masterList, 4); 
+0

したがって、groupedNamesにはN個のグループに分割されたリストが含まれます。どのようにしてこれらのグループをテキストボックスで印刷できますか?インデックスを介してどのように呼び出すことができますか? – jPol34

+0

各 "グループ"は 'List 'です。私は 'string.Join'(これはあなたの例でも使用しています)を使って私の例で出力する方法を示しました。また、配列のようにインデックスを使用することもできます(角括弧を使用しています(これも私の例で行います)。あなたの既存の 'foreach'コードでは動作しませんか?私はあなたのために働いていない部分を理解していません。 –

+0

はい、うまくいきました!ありがとう。 – jPol34