我有两个通用类型A
和B
列表:
public class A {
int type;
string params;
bool isActive;
}
public class B {
int type;
}
如何使用linq将它们映射到A
类型列表中B.type == A.type
(不是A.type == B.type
!!)?
类B
的实例包含可以删除或添加的int
值,而类A
的实例包含来自我的数据库的值。
例如:
A[0] = {1, "11", true}, A[1] = {2, "22", true}, A[2] = {3, "33", false}
和
B = {2, 3}
所需结果包含A[1]
和A[2]
。
答案 0 :(得分:3)
您想加入两个列表,请查找两个列表中的所有A
吗?
var query = from a in aList
join b in bList
on a.type equals b.type
select a;
List<A> resultList = query.ToList();
答案 1 :(得分:2)
听起来你的意思是“通过检查第二个列表中的属性来过滤第一个列表中的项目” - 在这种情况下,我建议:
从第二个列表构建索引:
// create an index of the "type"s to look for
var index = new HashSet<int>(bList.Select(x => x.type));
用它来过滤数据
// filter the primary list to values from the index
var matches = aList.FindAll(x => index.Contains(x.type));
这将非常有效地为您提供仅A
中具有相应值的bList
数据的列表。
这里可以运行:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
public class A
{
public int type;
public string @params;
public bool isActive;
}
public class B
{
public int type;
}
static void Main()
{
var aList = new List<A>
{
new A { type = 1, @params = "11", isActive = true },
new A { type = 2, @params = "22", isActive = true },
new A { type = 3, @params = "33", isActive = false },
};
var bList = new List<B>
{
new B { type = 2 },
new B { type = 3 },
};
// create an index of the "type"s to look for
var index = new HashSet<int>(bList.Select(x => x.type));
// filter the primary list to values from the index
var matches = aList.FindAll(x => index.Contains(x.type));
foreach (var match in matches)
{
Console.WriteLine($"{match.type}, {match.@params}, {match.isActive}");
}
}
}
带输出:
2, 22, True
3, 33, False
答案 2 :(得分:1)
这就是你要找的东西!?
var result = arrayA.Where(a => arrayB.Select(b => b.type).Contains(a.type)).ToArray();
答案 3 :(得分:0)
如果您有两个序列,其中两个序列都具有应匹配的值,并且您希望从第一个序列中获取零个或多个属性,并使用Enumerable.Join.
语法看起来有点困难,但如果经常使用,你会习惯它。
假设在您的示例中,您有一系列A对象和一系列B对象:
IEnumerable<A> myAobjects = ...
IEnumerable<B> myBobjects = ...
// do the join:
myAObjects.Join(myBobjects, // join the two sequences
myAobject => myAobject.type, // from the A sequence take property type
myBobject => myBobject.type, // from the B sequence also take property type
(myAobject, myBobject) => // whenever the values of these properties equal, take:
...);
这些点将以myAobject和myBobject的组合形式存储,这些组合具有相同的属性类型值。您的问题很简单:只要myAobject.type与myBobject.type匹配,您就需要完整的myAObject。在这种情况下,连接的最后一部分是:
(myAobject, myBobject) => myAobject
如果你想要其他东西返回,你会使用类似的东西:
(myAobject, myBobject) => new
{
MyParams = myAobject.Params,
MyOtherValue = myBObject.type,
}