2

我已经购买了物品和装备物品,我需要获得装备物品中的购买物品。我试过这个,但它给了我第 1 项和第 2 项x.Id == 2

user.BoughtItems.Where(x => equippedItems.Any(any => any.Id == x.Id))

使用以下方法执行测试:

BuyItems 有 2 件商品。一个 ID = 1,两个 ID = 2。

EquippedItems 有 1 个 Id = 2 的项目。

我期待一个 id = 2 的项目(来自 BoughtItems)的结果。

4

3 回答 3

1

尝试这个:

var equippedIds = equippedItems.Select(x => x.Id).ToHashSet();
var boughtAndEquipped = user.BoughtItems.Where(x => equippedIds.Contains(x.Id));

编辑:忘记了.ToHashSet()不是内置的,因为我在每个项目中都包含了一些 linq 扩展。这里是:

public static class Extensions
{
    public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
    {
        return new HashSet<T>(source);
    }
}
于 2013-07-24T17:51:41.760 回答
1
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

于 2013-07-24T17:54:06.503 回答
0

只需使用连接:

boughtItems.Join(equippedItems,b=>b.Id,eq=>eq.Id,(b,eq)=>b.Id);

这将返回 ID。如果您想要这两个项目,您可以通过将结果选择器(b,eq)=>b.Id替换为Tuple.Create来创建一个元组

然后,您可以分别使用返回实例的“Item1”和“Item2”属性访问购买和装备的相关物品。

于 2013-07-24T18:05:03.383 回答