1

2000 個の文字列の配列があります。文字列は、「芸術」、「経済」、「スポーツ」、「政治」です。500 要素ごとにグループ化し、その数を取得したい

誰か助けてくれませんか?

4

4 に答える 4

4

別の解決策:

var count = 0;
var dictionaries = 
    strings.GroupBy(s => count++ / 500)
           .Select(g => g.Distinct().ToDictionary(k => k, k => g.Count(s => s == k)))
           .ToList();

これにより、が作成されますList<Dictionary<string, int>>。各ディクショナリは500要素の集計を表します(最後のディクショナリの場合はそれより少ない場合もあります)。ここで、キーは文字列であり、値はディクショナリが表す500要素の中での文字列の出現回数です。

発生する可能性のあるすべての可能な値をハードコーディングする必要はありません。

最大限のパフォーマンスを得るには、次のバージョンを使用することもできます。

var count = 0;
var dictionaries = 
    strings.GroupBy(s => count++ / 500)
           .Select(g => g.Aggregate(
               new Dictionary<string, int>(), 
               (d, w) => { d[w] = (d.ContainsKey(w) ? d[w] + 1 : 1); return d; })
           )
           .ToList();

このバージョンは、ソース配列の各要素を1回だけ繰り返します。出力は最初のバージョンと同じ形式です。

于 2012-11-13T11:00:23.260 に答える
3
var result = strings.Select((s, i) => new { s, i })
                .GroupBy(x => x.i / 500)
                .Select(x => x.GroupBy(y => y.s)
                                .Select(z => new { 
                                                    Name=z.Key,
                                                    Count=z.Count()
                                                }).ToList())
                .ToList();
于 2012-11-13T10:55:21.717 に答える
3

試す

var grouping = Enumerable.Range(0,2000)
                       .Select(i => i / 500)
                       .Zip(Strings, (i,s) => new { Group = i, Str = s})
                       .GroupBy(anon => anon.Group,
                                anon => anon.Str,
                                (key,g) => new
                                           {
                                             Key = key,
                                             Art = g.Count(str => str == "art"),
                                             Economy = g.Count(str => str == "economy"),
                                             Politic = g.Count(str => str == "politic"),
                                             Sport= g.Count(str => str == "sport")
                                           });

foreach(anon in grouping)
{
    //textbox logic OP will have to change to suit
    TextBox1.WriteLine(String.Format("Group: {0}", anon.Key));
    TextBox1.WriteLine(String.Format("Art: {0}",anon.Art));
    TextBox1.WriteLine(String.Format("Economy: {0}",anon.Economy ));
    TextBox1.WriteLine(String.Format("Politic: {0}",anon.Politic ));
    TextBox1.WriteLine(String.Format("Sport: {0}",anon.Sport));
}

あるいは(スノーベアによる)

var grouping = Strings.Select((s,i) => new { Group = i / 500, Str = s})
                      .GroupBy(anon => anon.Group,
                               anon => anon.Str,
                               (key,g) => new
                                 {
                                  Key = key,
                                  Art = g.Count(str => str == "art"),
                                  Economy = g.Count(str => str == "economy"),
                                  Politic = g.Count(str => str == "politic"),
                                  Sport= g.Count(str => str == "sport")
                                 });

foreach(anon in grouping)
{
    //textbox logic OP will have to change to suit
    TextBox1.WriteLine(String.Format("Group: {0}",anon.Key + 1));
    TextBox1.WriteLine(String.Format("Art: {0}",anon.Art));
    TextBox1.WriteLine(String.Format("Economy: {0}",anon.Economy ));
    TextBox1.WriteLine(String.Format("Politic: {0}",anon.Politic ));
    TextBox1.WriteLine(String.Format("Sport: {0}",anon.Sport));
}
于 2012-11-13T10:51:20.677 に答える
1
int CountElementsInGroup = 500;
//from 500 to 1000
int NumberGroup = 2;
string[] GroupTypes = new string[4] { "art", "economy", "sport", "politic" };

//Fill example array
string[] arr = new string[2000];
Random rand = new Random();
for (int i = 0; i < arr.Length;i++ )
    arr[i] = GroupTypes[rand.Next(0, 3)];
    var res = (from p in arr.Skip((NumberGroup - 1) * CountElementsInGroup).Take(CountElementsInGroup)
              group p by p into g
              select new GroupCountClass { GroupName = g.Key, GroupCount = g.Count() });

textBox1.Text = "";
foreach (GroupCountClass c in res)
{
   textBox1.Text += String.Format("GroupName:{0} Count:{1};",c.GroupName,c.GroupCount);
}
于 2012-11-13T11:11:51.243 に答える