質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

13665閲覧

List(Of String()) をLinqでgroup byして集計したい

maed

総合スコア20

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/08/30 07:27

###やりたいこと
番号,数値,名前 で構成されたリストがあり、番号ごとに数値の合計と件数を取得したい。
例えば以下のデータが入っているとすると
1, 15000, sss
1, 1300, ccc
2, 10000, aaa
2, 50003, aaa
2, 200, oooo

結果として
1, 16300, 2
2, 60203, 3
↑が出てきて、これをまた別のList(Of String())に入れたい。

###やってみたこと

Dim resultList As New List(Of String()) resultList.Add(New String() {"1", "15000", "sss"}) resultList.Add(New String() {"1", "1300", "ccc"}) resultList.Add(New String() {"2", "10000", "aaa"}) resultList.Add(New String() {"2", "50003", "iii"}) resultList.Add(New String() {"2", "200", "oooo"}) Dim aaa As New List(Of String()) aaa = resultList.GroupBy(Function(s) Tuple.Create(s(0)), Function(s2, s) Return New With { .ShopID = s2.Item1, .Value1 = s.Sum(Function(s3) s3(1)), .Value2 = s.Count(Function(s3) s3(2)) } End Function)

###結果
aaa = のところで型が違う様な意味のエラーが出てしまいます。

###質問
Linqはさっぱり分からない中手探りで書いたのですが、ここからどうすれば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

aaaの型はList(Of String())なので、
GroupBy()メソッドの第2引数のラムダ式の戻り値はString()である必要があります。
匿名型では型が合いません。

また、s.Count(Function(s3) s3(2))の部分ですが、
Count()メソッドに与えるラムダ式は
カウントをする条件を表す式Func<TSource, bool> predicateなので、
この使い方だとエラーになってしまいます。

また、GroupBy()メソッドの第1引数は別にTupleを使わなくても良いんじゃないかな?とか
ちょこちょこ変えてますが、以上を踏まえて

c#

1Dim aaa As List(Of String()) 2aaa = resultList.GroupBy( 3 Function(s) s(0), 4 Function(s1, s2) New String() { 5 s1, 6 s2.Sum(Function(s3) s3(1)).ToString(), 7 s2.Select(Function(s3) s3(2)).Distinct().Count().ToString() 8 }).ToList()

みたいに書いてみました。

投稿2016/08/30 14:55

編集2016/08/30 15:51
TAKA_0921

総合スコア234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maed

2016/08/31 00:32

回答ありがとうございます。 ラムダ式の書き方がなかなか理解できない…。 s1だけどうしてインデックス不要で文字列になっているのでしょうか?
TAKA_0921

2016/08/31 13:56

ラムダ式は、 1. 式形式 2. ステートメント形式 と2パターンありますが、今回はどれも式形式のものを使っています。 詳しくはググってみてください。 GroupBy()メソッドはいくつかOverloadがありますけど、 今回使っているのは <ExtensionAttribute> Public Shared Function GroupBy(Of TSource, TKey, TResult) ( source As IEnumerable(Of TSource), keySelector As Func(Of TSource, TKey), resultSelector As Func(Of TKey, IEnumerable(Of TSource), TResult) ) As IEnumerable(Of TResult) ですね。(今回は、TSource : String(), TKey : String, TResult : String()) keySelectorはsourceの各要素(String())に対して、 「何をkeyとして使うか」を指定するものですね。 なので、ラムダ式の引数はString()で、戻り値はStringになっています。 次のresultSelectorは、 「さっきkeySelectorで指定したkey、 およびそのkeyでGroupingした結果(IEnumerable(Of String())から 何を最終的なElementにするか」を指定するものです。 なので、ラムダ式の第1引数はkeyと同じString、第2引数はIEnumerable(Of String())、 戻り値はString()になっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問