如何过滤列表?

时间:2009-11-16 17:42:16

标签: c# sorting loops generic-list

这是一种应该将已分配的用户从列表中删除的方法 并将未指定的人保留在列表中。 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,我们开始再次添加所有人。有没有人有任何关于如何做到这一点的建议是一种更有效的方法,并且一旦我们把所有事情都拿出来就避免加入。

谢谢!

2 个答案:

答案 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));

我想的不是你想要的东西:)