Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确保用户只被添加到列表中一次_C#_Linq_Sharepoint 2007 - Fatal编程技术网

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

C# 如何确保用户只被添加到列表中一次,c#,linq,sharepoint-2007,C#,Linq,Sharepoint 2007,我必须通过自定义搜索列出用户列表,从添加到sharepoint web上权限列表的所有组中获取所有用户。我的问题是,用户可以分为多个组,因此他们会被多次添加到返回的列表中。如何确保它们只添加一次 C# //关键字是用户在搜索文本框中键入的值 私有静态IEnumerable GetUsers(SPWeb、字符串关键字) { var oList=新列表(); var oListUsers=web.Groups.Cast().SelectMany(grp=>grp.Users.Cast().Where

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

C#
//关键字是用户在搜索文本框中键入的值
私有静态IEnumerable GetUsers(SPWeb、字符串关键字)
{
var oList=新列表();
var oListUsers=web.Groups.Cast().SelectMany(grp=>grp.Users.Cast().Where(user=>user.Name.Contains(关键字)).ToList();
foreach(olistuser中的SPUser用户)
{
//我在这里的尝试是检查列表是否已经包含当前项
//但它似乎忽视了这一点。我也试过数数,但结果是一样的。
如果(!oList.Contains(用户))
添加(用户);
}
回归寡头;
}

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

var uniqueValues = oList.Distinct();

这将删除具有相同引用的
SPUser
对象。此外,您还可以使用蛮力为自己的等式逻辑实现
IEQualityCompaper
,,您可以使用不同的:

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

看起来您的SPUser类需要实现
IEquatable
,以使contains按您的意愿工作。

问题在于,您的
oListUsers
列表中有代表同一用户的不同对象,但有不同的对象引用-因为
contains()
使用对象引用进行检查,除非在
SPUser
类上定义自定义比较器/等式,否则无法捕捉到这种情况

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

试试这个(而不是contains)


使用哈希集而不是列表。这样,您就不必检查容器,重复的项目将被忽略

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

var oList=new HashSet();
var oListUsers=web.Groups.Cast().SelectMany(grp=>grp.Users.Cast().Where(user=>user.Name.Contains(关键字)).ToList();
foreach(olistuser中的SPUser用户)
{
添加(用户);
}
oList.Contains(user)返回false,即使用户在该列表中?.Contains()执行引用检查类型是否为引用类型,如果oList不包含对用户当前迭代引用的同一对象的引用,则返回false。但是,您可以重写类中的.Equals()方法以强制进行特定的比较(例如,在user.Name属性上)。
var oListUsers = web.Groups.Cast<SPGroup>().SelectMany(grp => grp.Users.Cast<SPUser>().Where(user => user.Name.Contains(keywords))).Distinct().ToList();
 if (! oList.Any(u => u.Name == user.Name ))
 {
      oList.Add(user);
 }
 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);
    }