C# 如何检查列表中的非唯一值?

C# 如何检查列表中的非唯一值?,c#,list,collections,iteration,C#,List,Collections,Iteration,这是一个完全支撑的构造器,但这里我只展示第1行: Public Class Player (string firstName, string lastName, string email) 节目: Player player1 = new Player("Mike","Dalton", md@mail.com); Player player2 = new Player("Mario","Davis", mdavis

这是一个完全支撑的构造器,但这里我只展示第1行:

Public Class Player (string firstName, string lastName, string email)
节目:

Player player1 = new Player("Mike","Dalton", md@mail.com);
Player player2 = new Player("Mario","Davis", mdavis@mail.com);
Player player3 = new Player("Mia","Duncan", md@mail.com);
...

List<Player> players = new List<Player> { player1, player2, player3};
名单上有3名球员。真正的名单相当长。需要检查所有电子邮件地址是否唯一。 如您所见:email\u player1=email\u player3

最后,一个简单的message console.writeline应该告诉您是否有电子邮件加倍


你能帮我吗?

你可以尝试以下方法:

List<string> emailList = players.Select(x => x.Email).ToList();
if (emailList.Count > emailList.Distinct().Count())
{
   Console.WriteLine("Duplicate email address found.");
}
var playersGroupByEmailList = players.GroupBy(x => x.Email).Select(g => new { Email = g.Key, Count = g.Count() });
playersGroupByEmailList = playersGroupByEmailList.Where(x => x.Count > 1).ToList();
if (playersGroupByEmailList.Any())
{
   foreach (var playerGroupByEmail in playersGroupByEmailList)
   {
       Console.WriteLine($"{playerGroupByEmail.Email} is duplicate.");
   }
}

您可以尝试以下方法:

List<string> emailList = players.Select(x => x.Email).ToList();
if (emailList.Count > emailList.Distinct().Count())
{
   Console.WriteLine("Duplicate email address found.");
}
var playersGroupByEmailList = players.GroupBy(x => x.Email).Select(g => new { Email = g.Key, Count = g.Count() });
playersGroupByEmailList = playersGroupByEmailList.Where(x => x.Count > 1).ToList();
if (playersGroupByEmailList.Any())
{
   foreach (var playerGroupByEmail in playersGroupByEmailList)
   {
       Console.WriteLine($"{playerGroupByEmail.Email} is duplicate.");
   }
}
试试这个。。。 这将为您提供列表中存在的所有重复电子邮件的列表

 players.GroupBy(x => x.Email).SelectMany(g => g.Skip(1));
试试这个。。。 这将为您提供列表中存在的所有重复电子邮件的列表

 players.GroupBy(x => x.Email).SelectMany(g => g.Skip(1));
选择。。。将帮助您获取列表中元素的属性

 players.GroupBy(x => x.Email).SelectMany(g => g.Skip(1));
Distinct将帮助您使列表包含列表中唯一的元素

 players.GroupBy(x => x.Email).SelectMany(g => g.Skip(1));
如果要检查所有元素是否唯一,可以使用:

bool isUnique = players.Select(x => x.Email).Distinct().Count() == players.Select(x => x.Email).Count();
与:

players.Distinct.Count:计算唯一元素。 计数:对列表元素进行计数。 如果它们是相同的isUnique=true,则列表中的所有元素都是唯一的。 选择。。。将帮助您获取列表中元素的属性

 players.GroupBy(x => x.Email).SelectMany(g => g.Skip(1));
Distinct将帮助您使列表包含列表中唯一的元素

 players.GroupBy(x => x.Email).SelectMany(g => g.Skip(1));
如果要检查所有元素是否唯一,可以使用:

bool isUnique = players.Select(x => x.Email).Distinct().Count() == players.Select(x => x.Email).Count();
与:

players.Distinct.Count:计算唯一元素。 计数:对列表元素进行计数。 如果它们是相同的isUnique=true,则列表中的所有元素都是唯一的。

如果您认为电子邮件地址像数据库表的一个键,因为它是唯一的,只想存储每个键/电子邮件中的一个,那么列表可能不是最好的集合。 您可以改为使用仅接受唯一项的HashSet

请参阅Microsoft文档:

你是这样做的吗

HashSet<Player> players = new HashSet<Player>();
为了检查唯一性,您需要在类中实现IEquatable

public class Player:  IEquatable<Player>
{
    public string Email { get; set; }
    //Other properties, Constructor & methods etc.
   
    //It is important to implement GetHashCode!
    public override int GetHashCode()
    {
        return Email.GetHashCode();   
    }
 
    public bool Equals(Player other)
    {
        return this.Email.Equals(other.Email);
    }
}

如果您认为电子邮件地址像数据库表的一个键,因为它是唯一的,只想存储每个键/电子邮件中的一个,那么列表可能不是最好的集合。 您可以改为使用仅接受唯一项的HashSet

请参阅Microsoft文档:

你是这样做的吗

HashSet<Player> players = new HashSet<Player>();
为了检查唯一性,您需要在类中实现IEquatable

public class Player:  IEquatable<Player>
{
    public string Email { get; set; }
    //Other properties, Constructor & methods etc.
   
    //It is important to implement GetHashCode!
    public override int GetHashCode()
    {
        return Email.GetHashCode();   
    }
 
    public bool Equals(Player other)
    {
        return this.Email.Equals(other.Email);
    }
}

作为一种基本方法,您可以执行以下操作:

列表控制器=新列表; PlayerInfo中的foreach var播放器 { 如果controlList.Containsplayer.Email { Console.WriteLine与+player.email是重复的; } 其他的 { Console.WriteLineplayer.Email } controlList.Addplayer.Email; }
作为一种基本方法,您可以执行以下操作:

列表控制器=新列表; PlayerInfo中的foreach var播放器 { 如果controlList.Containsplayer.Email { Console.WriteLine与+player.email是重复的; } 其他的 { Console.WriteLineplayer.Email } controlList.Addplayer.Email; }
var distinctPlayersCount=players.Selectplayer=>player.Email.Distinct.Count会更好,因为当.Count为executed@Ramesh谢谢你的建议。我已经编辑了我的答案,非常好,这正是我想要的。现在开始申请这个职位对我来说太高级了一点,因为我还没有完全了解LINQ。所以我想:在一个月左右的时间里,我将开始应用你的解决方案。似乎100%legitvar distinctPlayersCount=player.Selectplayer=>player.Email.Distinct.Count会更好,因为当.Count为executed@Ramesh谢谢你的建议。我已经编辑了我的答案,非常好,这正是我想要的。现在开始申请这个职位对我来说太高级了一点,因为我还没有完全了解LINQ。所以我想:在一个月左右的时间里,我将开始应用你的解决方案。似乎100%合法ToList似乎不安全是的,事实上我在我的机器上试过,复制和粘贴补充了这一点。谢谢你提醒我,我试过编辑过的版本,但因为我对LINQ的了解很差,所以我无法进一步扩展。但是谢谢你的建议,我知道你想要什么了。好吧,我终于赶上了LINQ,并且想出了如何实现你的解决方案。。。伟大的回答@KovidPurohit!var listdubleemail=players.GroupByx=>x.Email.SelectManyg=>g.Skip1;在listDoubleEmail{Console.WriteLinedouble.Email;}中foreach var double是的,这是您实现的方式。ToList似乎不可靠是的,实际上我在我的机器上尝试过,复制和粘贴添加了它。谢谢你提醒我,我试过编辑过的版本,但因为我对LINQ的了解很差,所以我无法进一步扩展。但是谢谢你的建议,我知道你想要什么了。好吧,我终于赶上了LINQ,并且想出了如何实现
不是你的解决方案。。。伟大的回答@KovidPurohit!var listdubleemail=players.GroupByx=>x.Email.SelectManyg=>g.Skip1;listDoubleEmail{Console.WriteLinedouble.Email;}中的foreach-var-double是的,这是您实现的方式。使用哈希集而不是列表将使此代码更短更快。尝试了此方法,效果很好!特斯克Ederim@TdWRica Ederim,你很好用哈希集代替列表会使代码更短更快。试试这个&效果很好!特斯克Ederim@TdWRica Ederim,你很好我最终整合了你的建议。1行,简单易懂,100%有效我最终整合了你的建议。1行,非常简单易懂,100%有效,非常方便的信息,用于未来的应用程序。谢谢杰森!非常方便的信息为未来的应用程序。谢谢杰森!