按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)的结果。

按id选择子集的所有项目

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"属性访问购买和装备的相关项目。