无法使用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>> ,其中TSomethingRESOURCENAME的类型(很可能是string )。

编辑:你大概想要在这里使用的是SelectMany LINQ方法(参见@ pquest的评论)。 它将您列入资源名称的“一大列”的列表弄平,然后您可以使用Except

var allcurrentresourcename = scaninfo.SelectMany(a => a.VMList.Select(
    b => b.Resource.RESOURCENAME));

你甚至不需要行尾的ToList()

链接地址: http://www.djcxy.com/p/75253.html

上一篇: Unable to use use .Except on two List<String>

下一篇: Subquery in Where Clause of LINQ statement