按id选择子集的所有项目
本文关键字:项目 子集 id 选择 | 更新日期: 2023-09-27 18:24:40
我已经购买了物品和装备物品,我需要获得装备物品中的购买物品。我试过这个,但当x.Id == 2
时,它同时给了我项目1和2。
user.BoughtItems.Where(x => equippedItems.Any(any => any.Id == x.Id))
测试使用:
BoughtItems有2个项目。一个Id为1,两个Id为2。
EquippedItems有1个Id为2的项目。
我期望得到一个id为2的项目(来自BoughtItems)的结果。
static void Main(string[] args)
{
int[] BoughtItems = { 1, 2 };
int[] equippedItems = { 1 };
var result = BoughtItems.Where(x => equippedItems.Any(any => any == x));
foreach (var el in result)
Console.WriteLine(el);
}
结果:1
你能展示你所拥有的和你所需要的吗,因为现在我看不出你所说的问题了。
顺便说一句,这个有相同的结果:
class Itemm
{
public int Id { get; set; }
}
static void Main(string[] args)
{
List<Itemm> BoughtItems = new List<Itemm>() { new Itemm { Id = 1 }, new Itemm { Id = 2 } };
List<Itemm> equippedItems = new List<Itemm>() { new Itemm { Id = 1 } };
var result = BoughtItems.Where(x => equippedItems.Any(any => any.Id == x.Id));
foreach (var el in result)
Console.WriteLine(el.Id);
}
结果:1
试试这个:
var equippedIds = equippedItems.Select(x => x.Id).ToHashSet();
var boughtAndEquipped = user.BoughtItems.Where(x => equippedIds.Contains(x.Id));
EDIT:忘记了.ToHashSet()
不是内置的,因为我在每个项目中都包含了一些linq扩展。这是:
public static class Extensions
{
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
return new HashSet<T>(source);
}
}
只需使用联接:
boughtItems.Join(equippedItems,b=>b.Id,eq=>eq.Id,(b,eq)=>b.Id);
这将返回ID。如果您想要这两个项目,您可以通过将结果选择器(b,eq)=>b.Id替换为元组来创建一个元组。创建
然后,您可以分别使用返回实例的"Item1"answers"Item2"属性访问购买和装备的相关项目。