如何确保用户只被添加到列表一次

本文关键字:列表 一次 添加 何确保 确保 用户 | 更新日期: 2023-09-27 17:52:55

我必须通过自定义搜索列出用户列表,其中我从添加到sharepoint web权限列表的所有组中获取所有用户。我的问题是用户可能属于多个组,因此他们被多次添加到返回的列表中。我如何确保它们只被添加一次?

c#

// keywords is the whatever value a user types into the search textbox
private static IEnumerable<SPUser> GetUsers(SPWeb web, string keywords)
    {
        var oList = new List<SPUser>();
        var oListUsers = web.Groups.Cast<SPGroup>().SelectMany(grp => grp.Users.Cast<SPUser>().Where(user => user.Name.Contains(keywords))).ToList();
        foreach (SPUser user in oListUsers)
        {
            // My attempt here is to check if the list already contains the current item
            // but it seems to ignore it. I've tried counting too, but same outcome.
            if (!oList.Contains(user))
                oList.Add(user);
        }
        return oList;
    }

如何确保用户只被添加到列表一次

试试这个

 if (! oList.Any(u => u.Name == user.Name ))
 {
      oList.Add(user);
 }

看起来你的SPUser类需要实现IEquatable<SPUser>的包含工作,因为你想要它

您可以使用Linq获取唯一记录

var uniqueValues = oList.Distinct();

这将删除具有相同引用的SPUser对象。你也可以为你自己的公平逻辑实现IEqualityCompaprer<SPUser>

使用Hashset而不是List。这样,您就不必检查是否包含,并且重复的项将被忽略。

这也会更快,因为HashSet几乎可以简单地拒绝重复项,而List<>.Contains()是0 (n)

 var oList = new HashSet<SPUser>();
    var oListUsers = web.Groups.Cast<SPGroup>().SelectMany(grp => grp.Users.Cast<SPUser> ().Where(user => user.Name.Contains(keywords))).ToList();
    foreach (SPUser user in oListUsers)
    {
      oList.Add(user);
    }

通过暴力破解,您可以使用Distinct:

var oListUsers = web.Groups.Cast<SPGroup>().SelectMany(grp => grp.Users.Cast<SPUser>().Where(user => user.Name.Contains(keywords))).Distinct().ToList();

问题是,你有不同的对象在你的oListUsers列表,代表相同的用户,但有不同的对象引用-因为Contains()使用对象引用来检查,你将无法捕捉这种情况,除非你定义一个自定义比较器/相等在你的SPUser类。

或者,如果用户名是唯一的,你可以过滤掉重复的