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

时间:2011-04-26 15:06:40

标签: c# linq sharepoint-2007

我必须通过自定义搜索列出用户列表,其中我将所有组中的所有用户添加到sharepoint网站上的权限列表中。我的问题是用户可以在多个组中,因此他们会多次添加到返回的列表中。我如何确保它们只被添加一次?

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

6 个答案:

答案 0 :(得分:7)

试试这个(而不是包含)

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

答案 1 :(得分:5)

看起来您的SPUser类需要实现IEquatable<SPUser> for contains才能按您的意愿工作。

答案 2 :(得分:3)

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

var uniqueValues = oList.Distinct();

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

答案 3 :(得分:3)

使用Hashset而不是List。这样,您就不必检查包含,只会忽略重复的项目。

这也会更快,因为HashSet几乎可以轻易地拒绝重复,而List&lt;&gt; .Contains()是O(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);
    }

答案 4 :(得分:2)

蛮力,你可以使用Distinct:

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

答案 5 :(得分:0)

问题是你的oListUsers列表中有不同的对象代表同一个用户,但有不同的对象引用 - 因为Contains()使用对象引用来检查,你将无法除非您在SPUser类上定义自定义比较器/ Equality,否则请注意这种情况。

或者,如果用户名是唯一的,则可以按这种方式过滤掉重复项。