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;