-1

VB.NETでCharsのコレクションをグループ化しました

何かのようなもの

HashTable( 
          "A", List(OF Char) [ A,A,A,A,A,A,A,A],
          "B", List(OF Char) [ B,B,B,B,B],
          "C", List(OF Char) [ C,C,C]
         )

Linqを使用したコレクションを2+1の「ページ」(3つのネストされたコレクションを含む新しいコレクション)に分割したいのですが、それぞれに同じ数の各文字が含まれています

たとえば、上記のハッシュテーブルの結果は次のようになります。

List( 
     list(of char) [ A,A,A,A,B,B,C ]
     list(of char) [ A,A,A,A,B,B,C ]
     list(of char) [ B,C ]  // LAST PAGE CONTAINS 
    )

私の英語でごめんなさい...ありがとう。

4

3 に答える 3

0

これは、少なくとも目的の結果に近いものです(結果のリストには、(6/5/5)文字の3つのリストが含まれています)。

Dim dict = New Dictionary(Of String, List(Of Char)) From {
   {"A", New List(Of Char) From {"A"c, "A"c, "A"c, "A"c, "A"c, "A"c, "A"c, "A"c}},
   {"B", New List(Of Char) From {"B"c, "B"c, "B"c, "B"c, "B"c}},
   {"C", New List(Of Char) From {"C"c, "C"c, "C"c}}

}

Dim pageCount = 3
Dim allChars = dict.Values.SelectMany(Function(chr) chr)
Dim result As List(Of List(Of Char)) = allChars.
    Select(Function(chr, i) New With {.Char = chr, .Index = i}).
    GroupBy(Function(x) x.Index Mod pageCount).
    Select(Function(g) g.Select(Function(x) x.Char).ToList()).
    ToList()

これにより、演算子を使用して、辞書のプロパティ内のすべての文字がValues目的のページ数(この例では3)に分割されます。Enumerable.GroupByMod

于 2013-01-04T15:51:17.393 に答える
0

Heh-LINQでできるマングリングは驚くべきものです...これはTimのものとは少し異なるテイクです

(申し訳ありませんが、私のVBは本当に錆びていますが、これは多かれ少なかれ翻訳可能であるはずです)

var table = new Dictionary<char,List<char>>()
{
    {'A', new List<char>() {'A','A','A','A','A','A','A','A'}},
    {'B', new List<char>() {'B','B','B','B','B'}},
    {'C', new List<char>() {'C','C','C'}},      
};

var result = table
    .Select(kvp => new [] {
            new string(kvp.Key, kvp.Value.Count / 2), 
            new string(kvp.Key, kvp.Value.Count / 2), 
            new string(kvp.Key, kvp.Value.Count % 2 == 0 ? 0 : 1) })
    .Aggregate((acc, entry) => new [] {
            acc[0] + entry[0], 
            acc[1] + entry[1], 
            acc[2] + entry[2]})
    .Select(s => s.ToCharArray().ToList())
    .ToList();
于 2013-01-04T16:49:50.643 に答える
0
Dim input As New Dictionary(of Char, Char())
input.Add("A"c, {"A"c, "A"c, "A"c, "A"c, "A"c, "A"c, "A"c, "A"c})
input.Add("B"c, {"B"c, "B"c, "B"c, "B"c, "B"c})
input.Add("C"c, {"C"c, "C"c, "C"c})

Dim output As New List(of List(Of Char))
output.Add(input.SelectMany(Function(c) Enumerable.Repeat(c.Key, c.Value.Count \ 2)).ToList())
output.Add(output(0).ToList())
output.Add(input.SelectMany(Function(c) Enumerable.Repeat(c.Key, c.Value.Count Mod 2)).ToList())
于 2013-01-04T22:09:54.940 に答える