C# 如何检查列表中的非唯一值?
这是一个完全支撑的构造器,但这里我只展示第1行: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
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%有效,非常方便的信息,用于未来的应用程序。谢谢杰森!非常方便的信息为未来的应用程序。谢谢杰森!