C# 找出我';我已经见过面了

C# 找出我';我已经见过面了,c#,data-modeling,C#,Data Modeling,我有以下数据结构: public class Match { public List<Player> Participants; } public class Player { public string Name; } 根据这些数据,如果PlayerA想知道他与哪些玩家一起玩,答案将是PlayerB、PlayerC、PlayerD和PlayerE 我现在的问题是,如果我想显示哪个玩家与谁一起玩过,以及多久玩一次,那么什么样的数据结构最具逻辑性和最易于查询

我有以下数据结构:

public class Match
{

    public List<Player> Participants;

}

public class Player
{

    public string Name;

}
根据这些数据,如果
PlayerA
想知道他与哪些玩家一起玩,答案将是
PlayerB、PlayerC、PlayerD和PlayerE

我现在的问题是,如果我想显示哪个玩家与谁一起玩过,以及多久玩一次,那么什么样的数据结构最具逻辑性和最易于查询。毕竟,我想向用户展示这样的图表(uber paint skills):


您可以使用
Linq

List<List<Match> matches = ...
string player = "playerA";

var coplayers = matches.Where(x=>x.Any(p=>p.Participants.Any(s=>s.Name == player))) // get all participants where group contains participant.
           .SelectMany(x=> x.SelectMany(p=>p.Participants))                         // get all participants where group contains participant.
           .Where(x=>x.Name != player)                                              // List co participants 
           .GroupBy(x=>x.Name)                                                      // Distinct by grouping on Name or( need to override equal)
           .Select(x=>x.FirstOrDefault())
           .ToList()    
Listx.Any(p=>p.Participants.Any(s=>s.Name==player))//获取组中包含参与者的所有参与者。
.SelectMany(x=>x.SelectMany(p=>p.Participants))//获取组中包含参与者的所有参与者。
.Where(x=>x.Name!=player)//列出共同参与者
.GroupBy(x=>x.Name)//通过按名称或(需要重写equal)分组来区分
.Select(x=>x.FirstOrDefault())
托利斯先生()

选中此项作为建议,以使您的解决方案更整洁,让玩家覆盖等于。代码如下所示:

public class Player
{
    public override bool Equals(object obj)
    {
        var other = obj as Player;
        if (other == null)
            return false;
        return this.Name == other.Name;
    }

    public override int GetHashCode()
    {
        return this.Name.GetHashCode();
    }

    public string Name;
}
这可以让你按照下面的思路,找到一个更具可读性的对手解决方案

Player me = new Player { Name = "Me" };
var allMatches = new List<Match>
{
    new Match
    {
        Participants = new List<Player> 
        {
            me,
            new Player { Name = "Some Other Dude"}
        }
    },

    new Match
    {
        Participants = new List<Player>
        {
            me,
            new Player { Name = "My Rival" }
        }
    }
};

var myMatches = allMatches.Where(m => m.Participants.Contains(me)).ToList();
var myOpponents = myMatches.SelectMany(m => m.Participants.Except(new [] {me})).Distinct();
playerme=新玩家{Name=“me”};
var allMatches=新列表
{
新对手
{
参与者=新名单
{
我
新玩家{Name=“其他人”}
}
},
新对手
{
参与者=新名单
{
我
新玩家{Name=“我的对手”}
}
}
};
var myMatches=allMatches.Where(m=>m.particients.Contains(me)).ToList();
var myOpponents=myMatches.SelectMany(m=>m.Participants.Except(new[]{me})).Distinct();

让每位玩家维护一份他们遇到的人的姓名/身份的
列表。对于频率,
T
必须包括计数器
Player me = new Player { Name = "Me" };
var allMatches = new List<Match>
{
    new Match
    {
        Participants = new List<Player> 
        {
            me,
            new Player { Name = "Some Other Dude"}
        }
    },

    new Match
    {
        Participants = new List<Player>
        {
            me,
            new Player { Name = "My Rival" }
        }
    }
};

var myMatches = allMatches.Where(m => m.Participants.Contains(me)).ToList();
var myOpponents = myMatches.SelectMany(m => m.Participants.Except(new [] {me})).Distinct();