【问题标题】:Filter generic list with generic dictionary使用通用字典过滤通用列表
【发布时间】:2015-09-11 21:00:09
【问题描述】:

我正在尝试使用 LINQ 过滤此类List<Dictionary<String, Object>> 的列表,但我找不到方法。

我有这个代码:

private List<Dictionary<String, Object>> ValidateScenarioProductItemData(List<Dictionary<String, Object>> pList)
{
    foreach (var tItem in pList)
    {
        if (!string.IsNullOrEmpty(tItem["IsInternal"].ToString()))
        {
            var i = 0;
            foreach (var item in tPeriods)
            {
                i++;
                var tHasSails = tCycleProductItemSales.Where(
                        CPIS => CPIS.CycleId == Convert.ToInt32(tItem["CycleId"].ToString()) &&
                        CPIS.ProductItemId == Convert.ToInt32(tItem["ProductItemId"].ToString()) && 
                        CPIS.PeriodId == Convert.ToInt32(item.Id.ToString()));
                if (tHasSails.Count() == 0)
                {
                    tItem[string.Format("Datasource{0}Id", i)] = 0;
                }
            }
        }

    }
    return pList;
}

我想在 foreach 中过滤 pList 以避免通过键 IsInternal 避免询问下一个 if 并避免不必要的调用。

我已经尝试过了,但它不起作用: Filtering out values from a C# Generic Dictionary

【问题讨论】:

  • 什么是tPeriods?就这样我做对了:您想将必须的代码转换为 linq?
  • 不回答您的问题但使用tHasSails.Count 将枚举整个集合。如果您只对集合是否有任何元素感兴趣,请改用IEnumerable..Any
  • 对不起所有 pPeriods 是我需要的全局值
  • 这是非常低效的代码...O(n^2) 和大量装箱/拆箱...而且字典列表也不是很有用(现在搜索是 O(n))。 ..尝试转换(如果可能)字典的键以解释列表中的变化....

标签: c# linq


【解决方案1】:

如果我猜对了,您需要过滤掉键为“IsInternal”且对象不为空的字典项,那么这个怎么样 -

var filteredList = pList.Where(d => d.Keys.Contains("IsInternal") && d.Values != null);

【讨论】:

    【解决方案2】:

    当您遍历 2 个数据源时,我认为您无法将其加入 1 个 LINQ。 您可以做的最好的是将第一个条件加入 .Where 子句

    private List<Dictionary<String, Object>> ValidateScenarioProductItemData(List<Dictionary<String, Object>> pList)
    {
        var tPeriods = new List<dynamic>();
        var tCycleProductItemSales = new List<dynamic>();
        foreach (var tItem in pList.Where(x=>!string.IsNullOrEmpty(x["IsInternal"].ToString())))
        {
            var i = 0;
            foreach (var item in tPeriods)
            {
                i++;
                var tHasSails = tCycleProductItemSales.Where(CPIS => CPIS.CycleId == Convert.ToInt32(tItem["CycleId"].ToString()) && CPIS.ProductItemId == Convert.ToInt32(tItem["ProductItemId"].ToString()) && CPIS.PeriodId == Convert.ToInt32(item.Id.ToString()));
                if (!tHasSails.Any())
                {
                    tItem[string.Format("Datasource{0}Id", i)] = 0;
                }
            }
        }
        return pList;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多