我有:
List<int> A; //ids list
List<myObject> B;
myObject具有2个属性:
int id;
string state;
列表B包含列表A的所有ID以及更多。
我想获得List<myObject> C
,它由列表A中的所有ID组成,它们也都处于state ='Idle'。
最短的linq查询是什么?
答案 0 :(得分:2)
您可以使用LINQ Join + Where
来完成
void Main()
{
List<int> A = new List<int>() {1,2}; //ids list
List<myObject> B = new List<myObject>()
{
new myObject{Id=1,state="Run"},
new myObject{Id=2,state="Idle"},
new myObject{Id=3,state="Idle"},
};
var expectedResult = from t1 in B
join t2 in A on t1.Id equals t2
where t1.state == "Idle"
select t1;
}
// Define other methods and classes here
class myObject
{
public int Id { get; set; }
public string state { get; set; }
}
答案 1 :(得分:0)
下面是包含示例数据的分步示例:
class MyObject
{
public int Id { get; set; }
public string State { get; set; }
}
public static void Main(string[] args)
{
List<int> A = new List<int>()
{
1,
2
};
List<MyObject> B = new List<MyObject>()
{
new MyObject() { Id = 1, State = "Idle" },
new MyObject() { Id = 2, State = "Running" },
new MyObject() { Id = 3, State = "Idle" },
};
// Where to filter elements by contidion
var objectsFromA = B.Where(b => A.Contains(b.Id));
Console.WriteLine("Filtered with Id-List 'A': " + string.Join(", ", objectsFromA.Select(s => "\"" + s.Id + ": " + s.State + "\"")));
var onlyIdles = objectsFromA.Where(o => o.State == "Idle");
Console.WriteLine("Filtered only Idle: " + string.Join(", ", onlyIdles.Select(s => "\"" + s.Id + ": " + s.State + "\"")));
// Or in one single Where:
Console.WriteLine("Filtered only Idle: " + string.Join(", ", B.Where(b => A.Contains(b.Id) && b.State == "Idle").Select(s => "\"" + s.Id + ": " + s.State + "\"")));
}
答案 2 :(得分:0)
您可以使用Enumerable.Any
通过B
中的ID过滤A
,并在同一查询中检查空闲状态:
var idleObjectsQry =
from myObject in B
where A.Any(id => myObject.id = id) && (myObject.state == "Idle")
select myObject;
List<myObject> C = idleObjectsQry.ToList();
您也可以使用Join
,但是在LINQ中,您通常更喜欢组合而不是连接,因为它更灵活。
答案 3 :(得分:0)
List<myObject> C = B.Where(b => A.Contains(b.Id) && b.state == "Idle").ToList();
答案 4 :(得分:0)
尝试这样使用
List<myObject> C = B.where(x=>x.state =="Idle" && A.contains(x.Id)).select B.ToList();