Linq查询两个列表对象

Ren*_*eno 18 c# linq

我有两个对象:

ObjectA
{
   string code;
   string country;
}

ObjectB
{
   string code;
   string otherstuff;
}
Run Code Online (Sandbox Code Playgroud)

我有List<objectA>,List<ObjectB>而且我需要找到List<ObjectB>包含的所有对象objectA.Code.但无法管理在LINQ查询上实现它.

Jar*_*Par 39

听起来您正在尝试查找ObjectB其中code任何值都存在值的所有实例List<ObjectA>.如果有,请尝试以下方法

List<ObjectA> listA = ...;
List<ObjectB> listB = ...;
var all = listB.Where(b => listA.Any(a => a.code == b.code));
Run Code Online (Sandbox Code Playgroud)


jer*_*enh 14

听起来您想要将ObjectA列表与code属性上的ObjectB列表一起加入.这是一种方式:

List<ObjectA> listOfA = ...;
List<ObjectB> listOfB = ...;
var all = from a in listOfA
          join b in listOfB on a.code equals b.code
          select new {a,b};
Run Code Online (Sandbox Code Playgroud)

结果是一个匿名对象列表,包含2个属性:a类型为ObjectA,b类型为ObjectB,具有相同的属性 code


Bro*_*ass 6

为了有效地执行此操作,您可以先将代码放入a HashSet<string>然后使用Contains()查询来检查相关的B是否包含hashset中包含的代码:

var codes = new HashSet<string>(listOfAs.Select(x => x.code));
var selectedBs = listOfBs.Where( x=> codes.Contains(x.code));
Run Code Online (Sandbox Code Playgroud)


Oli*_*bes 5

我会将ObjectA列表的代码放入HashSet,否则您的查询将成为O(n 2)操作.像这样是一个O(n)操作:

var aList = new List<ObjectA>();
var bList = new List<ObjectB>();

var aCodes = new HashSet<string>(aList.Select(a => a.code));
var result = bList.Where(b => aCodes.Contains(b.code));
Run Code Online (Sandbox Code Playgroud)

  • 对于LINQ Google [LINQ教程C#](http://www.google.com/search?q=LINQ+tutorial+C%23).至于速度,这里的相关内容是掌握不同收集类型的基本知识及其优缺点.James Michael Hare在这里给出了一个很好的概述:[选择正确的收集类](http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class的.aspx) (2认同)