无法使用use.Except两个List <String>
我正在研究一个asp.net mvc-5 web应用程序。 我有这两个模型类: -
public class ScanInfo
{
public TMSServer TMSServer { set; get; }
public Resource Resource { set; get; }
public List<ScanInfoVM> VMList { set; get; }
}
public class ScanInfoVM
{
public TMSVirtualMachine TMSVM { set; get; }
public Resource Resource { set; get; }
}
我有以下方法: -
List<ScanInfo> scaninfo = new List<ScanInfo>();
List<String> CurrentresourcesNames = new List<String>();
for (int i = 0; i < results3.Count; i++)//loop through the returned vm names
{
var vmname = results3[i].BaseObject == null ? results3[i].Guest.HostName : results3[i].BaseObject.Guest.HostName;//get the name
if (!String.IsNullOrEmpty(vmname))
{
if (scaninfo.Any(a => a.VMList.Any(a2 => a2.Resource.RESOURCENAME.ToLower() == vmname.ToLower())))
{
CurrentresourcesNames.Add(vmname);
}
}
}
var allcurrentresourcename = scaninfo.Select(a => a.VMList.Select(a2 => a2.Resource.RESOURCENAME)).ToList();
var finallist = allcurrentresourcename.Except(CurrentresourcesNames).ToList();
现在我想一切都是字符串里面allcurrentrecoursename
名单,但不是里面CurrentresourcesName
?
但上述代码引发了以下例外: -
错误4'System.Collections.Generic.List>'不包含'Except'的定义和最佳扩展方法重载'System.Linq.Queryable.Except(System.Linq.IQueryable,System.Collections.Generic.IEnumerable) '有一些无效的论点
错误3实例参数:无法从'System.Collections.Generic.List>'转换为'System.Linq.IQueryable'
它看起来像我
var allcurrentresourcename = scaninfo.Select(a => a.VMList.Select(a2 => a2.Resource.RESOURCENAME)).ToList();
根本不像你想象的那样是一个字符串列表。 scaninfo
的类型是List<ScanInfo>
和lambda表达式
a => a.VMList.Select(a2 => a2.Resource.RESOURCENAME)
为每个ScanInfo
对象生成一个IEnumerable<TSomething>
。 因此,似乎allcurrentresourcename
不是一个List<string>
,而是一个List<IEnumerable<TSomething>>
,其中TSomething
是RESOURCENAME
的类型(很可能是string
)。
编辑:你大概想要在这里使用的是SelectMany
LINQ方法(参见@ pquest的评论)。 它将您列入资源名称的“一大列”的列表弄平,然后您可以使用Except
:
var allcurrentresourcename = scaninfo.SelectMany(a => a.VMList.Select(
b => b.Resource.RESOURCENAME));
你甚至不需要行尾的ToList()
。