C# 在LINQ表达式中连接对象

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

在本示例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 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;
    }
}