繁体   English   中英

C#<list> 如何检查列表中的非唯一值?</list>

[英]C# <LIST> How to check for non-unique values in the list?

这是构造函数(它是完整的,但在这里我只显示第一行):

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_player1 = email_player 3)

最后,一条简单的消息 (console.writeline) 应该说明是否存在 email_doubles。

你能帮我吗?

您可以尝试以下方法:

List<string> emailList = players.Select(x => x.Email).ToList();
if (emailList.Count > emailList.Distinct().Count())
{
   Console.WriteLine("Duplicate email address found.");
}

如果要专门显示重复的 email 地址,也可以尝试以下方法:

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));

Select(...)将帮助您获取列表中元素的属性。

Distinct()将帮助您使列表包含列表中的唯一元素。

如果要检查所有元素是否唯一,可以使用:

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

和:

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

如果您认为 email 地址就像数据库表的键一样,因为它是唯一的并且只想存储每个键/电子邮件中的一个,那么 List 可能不是最好的集合。

您可以改为使用仅接受唯一项目的HashSet

请参阅 Microsoft 文档: https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.hashset-1?redirectedfrom=MSDN&view=net-5.0

你这样声明

HashSet<Player> players = new HashSet<Player>();

当您尝试添加它时,它会根据它是否被接受(唯一)返回 true 到 false。

添加到设置:

if(players.Add(player))
    Console.Writeline($"Player {player} was added OK");
else
    Console.Writeline($"Player with email {player.Email} already exists in the collection!");

为了检查唯一性,您需要在IEquatable<T>中实现您的 class

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);
    }
}

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

List<string> controlList = new List<string>();
foreach (var player in PlayersInfo)
{
    if (controlList.Contains(player.Email))
    {
        Console.WriteLine("there is a duplicate with" + player.email);
    }
    else
    {
        Console.WriteLine(player.Email)
    }
    controlList.Add(player.Email);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM