【问题标题】:Where clause only returning a subset of products matching index arrayWhere 子句仅返回与索引数组匹配的产品子集
【发布时间】:2018-09-22 23:39:40
【问题描述】:

我有一份订购产品的清单。我还有一个索引值列表。我想提取索引在索引列表中的所有产品。现在我正在这样做:

var indexes = new List<int> { 1, 2, 5, 7, 10 };
var myProducts = orderedProducts.Where((pr, i) => indexes.Any(x => x == i)).ToList();

但是,myProducts 中只有 2 个元素:索引为 1 和 2 的产品。它完全漏掉了 5、7 和 10。这是怎么回事?我该如何解决这个问题?

注意:orderedProducts.Count 总是大于indexes 列表的最大值。

orderedProducts 由以下组成:

orderedProducts = productDictionary[fam.Key]
.ToList()
.OrderBy(g => g.factor)
.ToList();

其中g.factor 是一个int,fam.Key 是产品字典的一个int 键。我检查了 myProducts,它确实是一个按因子升序排序的 List&lt;Product&gt;

prodDictionaryDictionary&lt;int?, List&lt;Product&gt;&gt;

【问题讨论】:

  • 确定iorderedProducts 字典中的序数(从零开始)索引,而不是任意数据库键?
  • 您能告诉我们orderedProducts 的内容和生成的myProducts。你也可以只做indexes.Contains(i),如果性能一直是个问题,你可能想使用HashSet&lt;int&gt;
  • 这不会重现。 myProducts 包含所有 5 项,当我将此行添加到示例代码的开头时:var orderedProducts = Enumerable.Range(1, 20); 请添加一行代码填充 orderedProducts,以便您的代码重现问题,所以我们可以看看发生了什么。
  • 另外,在您的实际代码中,您不会碰巧有任何其他Where 调用吗?如果是这样,应该注意索引将来自过滤结果,而不是原始来源。
  • 啊,废话。我才意识到我的错误。生成索引的代码不正确。掌心。

标签: c# indexing where ienumerable


【解决方案1】:

您在测试中遗漏了一些东西。您说“myProducts.Count 总是大于索引列表的最大值”。考虑到您说“myProducts 只有 2 个元素”,这毫无意义。 orderedProducts.Count 必须小于 6。因此问题。您只需比较列表中的索引即可提取元素。您可以通过向列表中添加更多产品来“解决”问题。

void Main()
{
    var indexes = new List<int> { 1, 2, 5, 7, 10 };

    var orderedProducts = new List<Product>();

    orderedProducts.Add(new Product());
    orderedProducts.Add(new Product());
    orderedProducts.Add(new Product());
    orderedProducts.Add(new Product());
    orderedProducts.Add(new Product());
    //orderedProducts.Add(new Product());//Add this in and you will see a result at index 5
    //orderedProducts.Add(new Product());
    //orderedProducts.Add(new Product());//7
    //orderedProducts.Add(new Product());
    //orderedProducts.Add(new Product());
    //orderedProducts.Add(new Product());//10

    var myProducts = orderedProducts.Where((pr, i) => indexes.Any(x => x == i)).ToList();
}

public class Product
{
}

取消注释产品,您会得到预期的 5 个结果。基于 0 的数组上的 10 索引。

【讨论】:

  • 我为错字道歉。我的意思是 orderedProducts 总是大于索引的最大值。
【解决方案2】:

为什么不只是indexes.Where(i =&gt; i &lt; orderedProducts.Count).Select(i =&gt; orderedProducts[i]).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2013-07-28
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多