通过与另一个不同对象列表进行比较来过滤对象列表

5 c# list linq-to-sql

我的dbml文件中有以下3个类:

public class Player {
    public int PlayerID {get; set;}
    public string Name {get; set;}
 }

public class PlayerItem {
    public int PlayerItemID {get; set;}
    public int PlayerID {get; set;}
    public int ItemID {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

在Player.ID和PlayerItem.PlayerID之间创建了一个关联

Public Class CustomItem {
    public int ItemID {get; set;}
    public string ItemName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

这是设置:

  1. 我有一个玩家列表 - 列表<Player>
  2. 每个玩家都有一个类型为PlayerItem的Entityset子元素
  3. 我有一个项目列表 - 列表<Item>

如何只选择那些在PlayerItem列表中至少有一个自定义项目的玩家?这基本上匹配每个Player的PlayerItems中的ItemID和CustomItem中的Item ID.

最终,我想有一个简单的球员列表<Player>- 列表- 可以使用.

LBu*_*kin 6

LINQ让这件事变得简单:

players.Where( p => p.PlayerItemList.Any( 
              pi => customItems.Any( ci => ci.ItemID == pi.ItemID ) );
Run Code Online (Sandbox Code Playgroud)

这也可以用查询形式编写:

var result = from p in players
             from pi in p.PlayerItemList
             where customItems.Any( ci => ci.ItemID == pi.ItemID ) );
Run Code Online (Sandbox Code Playgroud)

如果您从自定义项集中创建查找表或字典,这将表现最佳:

var customItemDict = customItems.ToDictionary( ci => ci.ItemID );
var result = from p in players
             from pi in p.PlayerItemList
             where customItemDict.ContainsKey( pi.ItemID ) );
Run Code Online (Sandbox Code Playgroud)