从集合LINQ(C#)中的第一组中选择项目

时间:2015-12-16 11:46:03

标签: c# linq

我在c#中创建纸牌游戏,我有以下课程,包含玩家ID,每个玩家的卡片组和两张最强大的卡片:

public class ResultsList
{
    public int PlayerID = -1;
    public int Set = -1;
    public int Figure1 = -1;
    public int Figure2 = -1;
}

程序创建结果列表:

List<ResultsList> Results = new List<ResultsList>();

然后接下来按Set排序,接着按图1排序,然后按图2排序,所以我得到follownig list(例子):

PlayerID       Set       Figure1         Figure2
0              2         2               1
1              2         2               1
3              1         1               0

这意味着玩家&#34; 0&#34;和&#34; 1&#34;有相同的集合和数字,我想把它们都放在新的列表中

List<int> Winers= new List<int>();

但在以下情况中,&#34; 0&#34;是唯一的赢家:

PlayerID       Set       Figure1         Figure2
0              2         3               1
1              2         2               1
3              1         1               0

所以我想只把那个ID放到结果中 我该怎么做?

3 个答案:

答案 0 :(得分:0)

在订购Results后,您可以使用First获取获胜者,然后使用TakeWhile使其全部等于它:

var winner = Results.First()
var winners = Results.TakeWhile(r => r.Set == winner.Set && r.Figure1 == winner.Figure1 && winner.Figure2 == r.Figure2).ToList();

答案 1 :(得分:0)

您可以使用GroupBy

来实现此目的
List<ResultsList> winners = 
    results.GroupBy(r => new {Set = r.Set, Figure1 = r.Figure1, Figure2 = r.Figure2}).
    OrderBy(g => g.Key.Set).
    ThenBy(g => g.Key.Figure1).
    ThenBy(g => g.Key.Figure2).
    First().ToList();

如果已经订购results,您可以省略OrderByThenBy条款。

答案 2 :(得分:0)

List<ResultsList> items = Results.OrderByDescending(item1 => 
        item1.Set).ThenByDescending(item2 => item2.Figure1).ThenByDescending(item3 =>
            item3.Figure2).ToList();

        ResultsList winner = items[0];
        List<int> winners = new List<int>();
        winners.Add(winner.PlayerID);
        winners.AddRange(items.Where((item, index) => 
            index > 0 && item.Set == winner.Set && 
            item.Figure1 == winner.Figure1 && 
            item.Figure2 == winner.Figure2)
            .ToList().Select(item=>item.PlayerID));