C# Linq使用ALL语句删除结果

C# Linq使用ALL语句删除结果,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,嗨,我正在尝试使用Linq从列表中删除“所有”实体 问题:我正在搜索数据库中具有某些证书的用户。问题是它会一行一行地返回它们。。。。但我需要检查的是:用户是否持有所有必需的证书。这应该根据我的int数组进行检查 这是我的数组:[3,5,16],现在我想从列表中删除所有没有这三个数组的用户。代码中数组的名称是必需的 我得到的列表项如下所示 listitem.CertificateValue listitem.Uid listitem.NameOfPerson 因此,对于这个示例,基本上Peter在

嗨,我正在尝试使用Linq从列表中删除“所有”实体

问题:我正在搜索数据库中具有某些证书的用户。问题是它会一行一行地返回它们。。。。但我需要检查的是:用户是否持有所有必需的证书。这应该根据我的int数组进行检查

这是我的数组:[3,5,16],现在我想从列表中删除所有没有这三个数组的用户。代码中数组的名称是必需的

我得到的列表项如下所示

listitem.CertificateValue
listitem.Uid
listitem.NameOfPerson

因此,对于这个示例,基本上Peter在列表中有三行,在本例中,所有行都需要保留在列表中。但是Philip只有2行,因此这两行都应该删除,因为他没有满足全部搜索条件

另外,CopyOfMandatory只是为了不干扰原始集合并引起预期(集合大小已更改)

更新 RemoveAll的工作原理与if语句的工作原理类似,但不符合预期

这样做并不会带走列表中的任何部分,我开始使用&而不是| |,但如果这样做,它会杀死所有东西,但最后遇到的人除外,只要他/她满足搜索条件


有人对如何做到这一点有什么提示吗

您的if
所有
标准已关闭

if (!mandatoryusers.All(i => mandatory.Contains(i.CertificateValue) 
                        || i.Uid == item.Uid))
{
     mandatoryusers.RemoveAll(i => i.Uid == item.Uid);
}
它需要使用
&&
而不是
|
,您应该调用
Any()
而不是
All()


希望我能正确理解你的逻辑和问题

您的if
所有
标准已关闭

if (!mandatoryusers.All(i => mandatory.Contains(i.CertificateValue) 
                        || i.Uid == item.Uid))
{
     mandatoryusers.RemoveAll(i => i.Uid == item.Uid);
}
它需要使用
&&
而不是
|
,您应该调用
Any()
而不是
All()


希望我能正确理解你的逻辑和问题

您的
All
调用不够精细:它试图确保所有条目始终存在。。。并非每个用户的所有条目都存在

尝试将每个条目转换为字典:

var dict = new Dictionary<int, List<ItemType>>();
foreach (var mandatoryItem in mandatoryItems)
{
    List<ItemType> itemTypeValue = null;
    if (!dict.TryGetValue(mandatoryItem.Uid, out itemTypeValue)
    {
        itemTypeValue = new List<ItemType>();
        dict.Add(mandatoryItem.Uid, itemTypeValue);
    }
    itemTypeValue.Add(mandatoryItem);
}

您的
All
调用不够精细:它试图确保所有条目始终存在。。。并非每个用户的所有条目都存在

尝试将每个条目转换为字典:

var dict = new Dictionary<int, List<ItemType>>();
foreach (var mandatoryItem in mandatoryItems)
{
    List<ItemType> itemTypeValue = null;
    if (!dict.TryGetValue(mandatoryItem.Uid, out itemTypeValue)
    {
        itemTypeValue = new List<ItemType>();
        dict.Add(mandatoryItem.Uid, itemTypeValue);
    }
    itemTypeValue.Add(mandatoryItem);
}

我想试试那样的

var uIdToRemove = mandatoryusers.GroupBy(m => m.Uid)
                    .Where(g => mandatory.Except(g.Select(s => s.CertificateValue)).Any())
                    .Select(g => g.Key).ToList();

mandatoryusers.RemoveAll(x => uidToRemove.Contains(x.Uid));

我想试试那样的

var uIdToRemove = mandatoryusers.GroupBy(m => m.Uid)
                    .Where(g => mandatory.Except(g.Select(s => s.CertificateValue)).Any())
                    .Select(g => g.Key).ToList();

mandatoryusers.RemoveAll(x => uidToRemove.Contains(x.Uid));

您的
如果
语句不正确(如您所述)-它将尝试检查所有项目是否都包含一个id为
必填项
或用户id为当前项目的中id的证书。您应该首先按userid进行过滤,然后检查证书。
不过,我不会这样做的。我会按用户对结果进行分组,然后检查证书

var usersWithAllCertificates = mandatoryUsers.GroupBy(mu => mu.Uid)
             //Select the ones that have all 3 certificates
             .Where(g => g.Select(u => u.CertificateValue)
                 .Intersect(mandatory).Count() == 3)
             .Select(g => g.ToList());

Intersect
操作符将组合列表,结果将是两个列表中相同的项目。因此,如果用户拥有全部3个证书(3、5和16),则相交的结果将是3项。
usersWithAllCertificates
对象将包括您想要的所有用户。这是明确地选择您想要的值,而不是删除您不想要的值,这是一种更好的方法。请注意,这假设每个用户只在列表中出现一次(即只有3个证书)

如果您的
语句不正确(如您所述)-它将尝试检查是否所有项目都包含一个id为
强制
的证书,或者用户id为当前项目的
证书。您应该首先按userid进行过滤,然后检查证书。
不过,我不会这样做的。我会按用户对结果进行分组,然后检查证书

var usersWithAllCertificates = mandatoryUsers.GroupBy(mu => mu.Uid)
             //Select the ones that have all 3 certificates
             .Where(g => g.Select(u => u.CertificateValue)
                 .Intersect(mandatory).Count() == 3)
             .Select(g => g.ToList());

Intersect
操作符将组合列表,结果将是两个列表中相同的项目。因此,如果用户拥有全部3个证书(3、5和16),则相交的结果将是3项。
usersWithAllCertificates
对象将包括您想要的所有用户。这是明确地选择您想要的值,而不是删除您不想要的值,这是一种更好的方法。请注意,这假设每个用户只在列表中出现一次(即只有3个证书)

必需的
您需要的证书数组,即
[3,5,16]
?是的,很抱歉不清楚!
是强制性的
您需要的一系列证书,即
[3,5,16]
?是的,很抱歉不清楚!你好谢谢,我尝试了&&第一行,但它所做的只是从我的列表中删除除最后两行以外的所有行。好像它一直在检查所有的东西,但当剩下的两个只有两个时,它就让它通过了。@carlpalson我更新了答案。我意识到你想要任何而不是所有的if语句。嗨!谢谢,我尝试了&&第一行,但它所做的只是从我的列表中删除除最后两行以外的所有行。好像它一直在检查所有的东西,但当剩下的两个只有两个时,它就让它通过了。@carlpalson我更新了答案。我意识到你想要if语句的any-any而不是All。@RaphaëlAlthaus-ha!你说得对。我是说,
Intersect
。谢谢@拉法拉塔尔豪斯哈!你说得对。我是说,
Intersect
。谢谢