这是一种应该将已分配的用户从列表中删除的方法 并将未指定的人保留在列表中。 GuidList添加了userId 按下按钮就可以了。 profileList用于填充gridView。
以下是代码:
private VList<VW_profiles> FilterAssigned(VList<VW_profiles> profileList)
{
VList<VW_profiles> sortedList = new VList<VW_profiles>();
foreach(VW_profiles profile in profileList)
{
if(GuidList.Count > 0)
{
foreach(Guid userId in GuidList)
{
if(profile.UserId != userId)
{
sortedList.Add(profile)
}
}
}
else
{
sortedList = profileList;
}
}
return sortedList;
}
现在这是我的问题。 Everythings似乎工作得很好 profileList中的所有项目也都是 添加到GuidList。然后而不是做出否定 两个Guid ID,我们开始再次添加所有人。有没有人有任何关于如何做到这一点的建议是一种更有效的方法,并且一旦我们把所有事情都拿出来就避免加入。
谢谢!
答案 0 :(得分:6)
如果VList<T>
是List<T>
,那么您可以这样做:
profileList.RemoveAll(profile => GuidList.Contains(profile.UserId));
如果表现有问题并且有很多Guid要删除,那么你可以将GuidList设为HashSet<Guid>
。
修改根据评论:如果您不想修改原始列表,请执行以下操作:
var filtered = new VList<VW_profiles>(
profileList.Where(profile => !GuidList.Contains(profile.UserId)));
修改如果您没有使用List<T>
,这里有一个方法可以用于实现IList<T>
的可调整大小的列表以及可以在数组上使用的方法{{1 }})。通过仅从列表末尾删除项目,对于T[]
的大多数实现,O(n²)算法将是O(n)。
IList<T>
答案 1 :(得分:2)
您的问题出在以下代码中:
foreach(Guid userId in GuidList)
{
if(profile.UserId != userId)
{
sortedList.Add(profile)
}
}
应该更像是:
bool inList = false;
foreach(Guid userId in GuidList)
{
if(profile.UserId == userId)
{
inList = true;
}
}
if (!inList)
sortedList.Add(profile)
或者,LINQ风格越多:
bool inList = GuidList.Any(x => x == profile.UserId);
if (!inList)
sortedList.Add(profile)
您当前的代码更像是:
GuidList.Where(x => x != profile.UserId)
.Foreach(x => sortedList.Add(x));
我想的不是你想要的东西:)