C# 在LINQ表达式中连接对象
在本示例C中,如何在LINQ select中连接对象:C# 在LINQ表达式中连接对象,c#,.net,vb.net,C#,.net,Vb.net,在本示例C中,如何在LINQ select中连接对象: Class Room Public Area As Integer End Class Class RoomPair One As Room Two As Room End Class Dim pairs as List(Of RoomPair) = mySource.GetRoomPairs() ' Select rooms with Area > 100 from my pairs ' Dim roomsArea
Class Room
Public Area As Integer
End Class
Class RoomPair
One As Room
Two As Room
End Class
Dim pairs as List(Of RoomPair) = mySource.GetRoomPairs()
' Select rooms with Area > 100 from my pairs '
Dim roomsAreaLargerThat100 = From p In pairs Select p.One, p.Two???
' roomsAreaLargerThat100 should be a IEnumerable or a List(Of Rooms) '
如果你想返回一个列表,你可以简单地调用.ToList。希望这对你有所帮助
Dim roomsAreaLargerThat100 = From p In pairs
Where p.One.Area > 100 || p.Two.Area > 100
Select p
展平列表,然后执行正常的where条件:
pairs.SelectMany(p => new List<Room> {p.One, p.Two}).Where(r => r.Area > 100)
如果我理解正确的话,你需要的不是加入,而是联盟。考虑使用C,因为我可能会在VB.Net中犯一些错误:
class Room
{
public int Area;
}
class Pair
{
public Room One;
public Room Two;
}
// In some class...
public List<Pair> pairs = new List<Pair>();
// (...) in some method
// Retrieve the members "One" that are larger
var query_for_one = from p in pairs
where p.One.Area > 100
select p.One;
// Retrieve the members "Two" that are larger
var query_for_two = from p in pairs
where p.Two.Area > 100
select p.Two;
// Return the union of both queries:
var query = query_for_one.Union(query_for_two);
当然,最好编写一个在一次迭代中完成的方法:
public IEnumerable<Room> GetRooms(int areaLargerThan, IEnumerable<Pair> pairs)
{
foreach (var p in pairs)
{
if (p.One.Area > areaLargerThan) yield return p.One;
if (p.Two.Area > areaLargerThan) yield return p.Two;
}
}
为什么在不相关的情况下将其标记为c?请仔细阅读第一个命题pairs应定义为ListOf RoomPair吗?@MichaelMinton fixed,你是对的……这不对,x的类型将是RoomPair而不是Room。pairs是一个列表,因此上面的命题将不起作用,因为x是一对,而不是一个房间。现在是类似于dasblinkenlight的答案的东西了吗?我可以检查x.1和x.2是否为零吗?我已经更新了答案,对房间进行了空检查。我按照这些思路思考,但不记得是什么方法做的。感谢您提醒我SelectMany,并让我阅读其中的文档,以便正确理解它在这里的作用,因为我有到hand-。我还可以检查p.One或p.Two是否为空吗?@serhio您可以将其添加到Where条件中,如下所示:Wherer=>r!=空和r.区域>100
public IEnumerable<Room> GetRooms(int areaLargerThan, IEnumerable<Pair> pairs)
{
foreach (var p in pairs)
{
if (p.One.Area > areaLargerThan) yield return p.One;
if (p.Two.Area > areaLargerThan) yield return p.Two;
}
}