如何避免向列表视图控件添加重复的行

本文关键字:添加 控件 何避免 列表 视图 | 更新日期: 2023-09-27 18:34:39

我有一个要向其添加帐户的列表视图控件。列表视图的第一列用于帐户的用户名,第二列用于帐户的密码。

我想避免添加重复登录凭据行。我的意思是,我不在乎用户名是否多次出现在列表视图控件中。只要用户名的每个实例都有不同的密码。相同的规则适用于密码。我不在乎多个帐户是否具有相同的密码。

我只是想避免重复的行

以下代码是我尝试过但没有成功的东西:

private void AddAccounts()
{
    List<string> usernames = new List<string>();
    usernames.Add("Margaret Parker");
    usernames.Add("Steven Stewart");
    usernames.Add("Heather Powell");
    usernames.Add("Denise Simmons");
    usernames.Add("Ronald Moore");
    List<string> passwords = new List<string>();
    passwords.Add("mExEvHb3");
    passwords.Add("muFLdtHu");
    passwords.Add("GrcSNCyY");
    passwords.Add("S8qenUZY");
    passwords.Add("PVAzFYyu");
    // usernames.Count will always be the same as passwords.Count
    // so it doesn't matter which property I use.
    for (int i = 0; i < usernames.Count; i++)
    {
        ListViewItem lvi = new ListViewItem(usernames[i]);
        lvi.SubItems.Add(passwords[i]);
        if (!accountsListView.Items.Contains(lvi))
        {
            // It is unsafe to call a control from a thread other
            // than the one that created the control without using
            // the Invoke method.
            Invoke((MethodInvoker)delegate { accountsListView.Items.Add(lvi); });
        }
    }
}

当调用AddAccounts((时,它会将以下项添加到accountsListView

    /*
    #   Margaret Parker       mExEvHb3
    #   Steven Stewart        muFLdtHu
    #   Heather Powell        GrcSNCyY
    #   Denise Simmons        S8qenUZY
    #   Ronald Moore          PVAzFYyu
    */

不会考虑帐户是否已添加到列表视图控件。这就是为什么我来找你们寻求帮助。

如何避免向列表视图控件添加重复行?

感谢您抽出宝贵时间阅读我的问题。

我想允许同一用户名或密码的多个实例:

    /*
    #   JamesEdwards ---- LZsDVQ7A ---- different password (GOOD!)
    #   GeraldLopez  ---- LZsDVQ7A    
    #   JamesEdwards ---- 7cbrPRzt ---- different password (GOOD!)
    */

我想避免完全重复:

    /*
    #   PhillipAnderson ---- 4ZN5TKfM ---- exact duplicate (BAD!)
    #   NicholasPowell  ---- 4ZN5TKfM    
    #   PhillipAnderson ---- 4ZN5TKfM ---- exact duplicate (BAD!)
    */

如果帐户的密码发生更改,则我希望能够使用新密码将该帐户再次添加到我的列表视图控件中。我还想将旧帐户信息保留在我的列表视图控件中。这就是为什么我想在我的列表视图控件中允许重复的用户名。

如何避免向列表视图控件添加重复的行

您正在创建一个新的ListViewItem实例并验证集合中的存在,该实例执行引用检查并始终返回false

而不是这个accountsListView.Items.Contains(lvi)

这样做

ListViewItem item = accountsListView.FindItemWithText(userNames[i]);
if (item == null)
{
    // logic goes here.
}

bool found = false;
foreach(ListViewItem lv in accountsListView.Items)
{
    if(lv.Text ==userNames[i]) 
    {
        found = true; 
        break;
    }
}
if(!found)
{
     // logic goes here.   
} 

记下ListView还提供验证项目是否存在FindItemWithText

代码中需要更改的内容很少。您不必为此使用 2 个列表。一个清单就足够了。可以使用 C# 中的可用功能更有效地执行此类操作。

所以作为第一步;创建一个类并从IEqualityComparer继承它。我们必须覆盖EqualsGetHashCode方法,以便在 Linq 等中使用。

    public class UserAccount : IEqualityComparer<UserAccount>
    {
        public string UserName { get; set; }
        public string Password { get; set; }
        public bool Equals(UserAccount x, UserAccount y)
        {
            return (x.UserName == y.UserName && x.Password == y.Password);
        }
        public int GetHashCode(UserAccount obj)
        {
            return obj.UserName.GetHashCode() + obj.Password.GetHashCode();
        }
    }

然后使用上面创建的类创建用户帐户List

       var userAccounts = new List<UserAccount>
       {
           new UserAccount() {UserName = "PhillipAnderson", Password = "4ZN5TKfM"},
           new UserAccount() {UserName = "NicholasPowell", Password = "4ZN5TKfM"},
           new UserAccount() {UserName = "PhillipAnderson", Password = "4ZN5TKfM"}
       };

现在,您可以使用Distinct方法来过滤掉重复的用户帐户。 您会注意到uniqueUserAccounts在应用Distinct后只有 2 个用户帐户。

        var uniqueUserAccounts = userAccounts.Distinct(new UserAccount()).ToList();
        foreach (var uniqueUserAccount in uniqueUserAccounts)
        {
            //your code to add user accounts to the list view
        }