按ID选择子集的所有项目

时间:2013-07-24 17:48:02

标签: c# linq

我已经购买了物品和装备物品,我需要购买装备物品中的物品。我尝试了这个但是在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。

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

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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

答案 2 :(得分:0)

只需使用加入:

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

这将返回ID。如果你想要两个项目,你可以通过用 Tuple.Create (b,eq)=&gt; b.Id 来创建一个元组。 >

然后,您可以使用&#34; Item1&#34;访问已购买和配备的相关项目。和&#34; Item2&#34;分别返回实例的属性。