无法使用use . except在两个List

本文关键字:List 两个 String use except | 更新日期: 2023-09-27 18:18:31

我正在做一个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>'不包含"除非"和最佳扩展的定义方法重载"System.Linq.Queryable.Except (System.Linq.IQueryable,System.Collections.Generic.IEnumerable)'有一些无效的参数

错误3实例参数:不能转换"System.Collections.Generic.List>"System.Linq.IQueryable"

无法使用use . except在两个List<String>上

在我看来

var allcurrentresourcename = scaninfo.Select(a => a.VMList.Select(a2 => a2.Resource.RESOURCENAME)).ToList();

根本不是您所期望的字符串列表。scaninfoList<ScanInfo>型,λ表达式

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()