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

C# Linq使用groupby选择列表中的所有项目,c#,linq,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   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
我需要得到的种族总数(计数),其中有所有匹配的字母与相同的消旋

即搜索“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
值。

试试这个

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


希望有帮助,

这应该对您有用:

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));
racecont
将为您提供2条记录,
results2
将为您提供您期望的4条记录


不管怎样,你提供的数据对我有用

您不需要
。只是
raceValues.Where(record=>dataValues.Contains(record.data))发布
raceData
如何,这样我们就不必创建您的示例环境。完全输入绑定的答案。@eocron06请阅读问题。这里有一个项目列表,他解释说搜索“a”和“J”=2(种族1和3),还有一个字符串数组用于比较。它是如何动态的请解释或添加一个答案。我想OP询问了做这件事的一般原则。若你们认为这个输入是恒定的,那个么就完全错了,你们可以给出最终的答案。@eocron06 OP清楚地说明了他的条件,它怎么可能是一般的?他有一系列的搜索字符串?@Berkay没有,但原因可能与第一个相同。您的查询依赖于已经确定哪些种族符合条件。你不必知道第1站和第3站有资格参赛。你想解释一下吗?如果你不解释为什么你认为这是一个糟糕的答案,你就不会帮助网站。我没有投反对票,但你没有一个结果的定义来获得比赛计数。我不是反对票:但另外,我需要获得每个人的位置数据。这使问题变得不清楚。似乎OP想要与
dataValues
中的数据竞争。计数是比赛结束后的比赛数量filtering@NetMage谢谢,这是复制/粘贴错误。应该是
results
@Fabio位置数据是
results2
产生的记录的一部分。我想我可以直接打开一个
Select(rd=>rd.position)
?我不明白你对伯爵的评论。比赛的数量最初是3,根据OP的要求,我的过滤返回2。
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;