2016-10-21 11 views
1

と、リストに私はリストとして、次のデータを持っているすべての項目を選択します。LINQのはGROUPBY

raceId data position 
1  A  0 
1  B  0 
1  F  1 
1  J  0 
2  A  2 
2  F  1 
3  A  0 
3  J  2 
3  M  1 
3  V  3 

私は同じraceidと一致するすべての文字があるレースの合計(カウント)を取得する必要があります。

すなわち加えて「A」と「J」= 2(レースの1および3)

の検索、私はそれぞれの位置データを取得する必要があります。

raceId data position 
1  A  0 
1  J  0 
3  A  0 
3  J  2 

これまでのところ、次のコードがあります。

var dataValues = new string[] { 'A', 'J' }; 

var races = raceData 
    .GroupBy(ac => ac.raceId) 
    .Select(grp => grp.First()) 
    .Where(t => 
     dataValues 
     .All(s => 
      dataValues 
      .Contains(t.data) 
     ) 
    ); 

var racecount = races.count() 

問題は、これがデータ内のいずれかの文字があり、すべてのraceIdの値を返すことです。

+0

「グループ」は必要ありません。 'raceValues.Where(record => dataValues.Contains(record.data)); ' – Fabio

+0

サンプル環境を作成する必要がないように' raceData'をポストするのはどうですか? –

答えて

2

を助け

list.GroupBy(t => t.raceID).SelectMany(k => k).Where(x => dataValues.Contains(x.data)) 
.Select(f=> new { f.data ,f.position,f.raceID}).ToList(); 

結果

enter image description here

、これを試してみてください:

var results = raceData.GroupBy(rd => rd.raceId) 
    .Where(g => dataValues.All(dv => g.Select(g2 => g2.data).Contains(dv))); 

int raceCount = results.Count(); 

var results2 = results 
    .SelectMany(g => g) 
    .Where(rd => dataValues.Contains(rd.data)); 

raceCountは2を、results2はあなたが期待している4つのレコードを提供します。

これは私のために提供されたデータと一緒にとにかく機能します!

+0

Downvoterは説明するように気をつけますか?なぜあなたはそれが悪い答えだと思うか説明していないなら、あなたはサイトを助けていません。 – itsme86

+0

私はdownvoteをしませんでしたが、あなたはraceCountを得るためにresultの定義を持っていません。 – NetMage

+0

私はdownvoterではありません:_さらに、私はそれぞれの位置データを取得する必要があります。これは疑問を明確にします。 OPのように、 'dataValues'のデータを持つレースが必要です。そしてカウントはフィルタリング後のレース数です – Fabio

-1

ホープこれはあなたのために働く必要があり、

+0

結び付いた入力はバインドされた答えです。 – eocron

+0

@ eocron06ご質問をお読みください。アイテムのリストがあり、彼は_aが 'A'と 'J' = 2(レース1と3)_を検索し、また比較のために文字列配列があると説明しました。どのように動的にすることができます説明したり、答えを追加してください。 – Berkay

+1

私はOPがそれをする一般原則について尋ねたと思う。この入力が一定であると思うなら、何かが完全に間違っていて、あなたは最終的な答えを出すことができます。 – eocron

0
var groupedRaces = from r in raceData 
    group r by r.raceId into gp 
    select new { raceId = gp.Key, Datas = gp.Select(g => g.data).ToArray() }; 

var raceIds = from r in groupedRaces 
    where dataVals.All(mv => r.Datas.Contains(mv)) 
    select r.raceId; 

var races = from r in raceData 
    where raceIds.Contains(r.raceId) && dataVals.Contains(r.data) 
    select r;