Linq用groupby选择列表中的所有项目

时间:2016-10-21 21:24:17

标签: c# linq

我将以下数据作为列表:

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的种族总数(计数)。

I.E搜索'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值。

3 个答案:

答案 0 :(得分:2)

这应该适合你:

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条记录。

无论如何,它对我提供的数据非常有用!

答案 1 :(得分: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;

答案 2 :(得分:-1)

试试这个,

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

希望有所帮助,