【问题标题】:Search for a value in List<Dictionary<string, object>>在 List<Dictionary<string, object>> 中搜索一个值
【发布时间】:2012-09-06 02:59:49
【问题描述】:

我有一个List&lt; Dictionary &lt; string, object &gt;&gt; 变量,如下所示。

private static List<Dictionary<string, object>> testData = new List<Dictionary<string, object>>(100);

// Just Sample data for understanding.
for (int i = 0; i < 100; i++)
{
    var test = new Dictionary<string, object>
        {
            { "aaa", "aaa" + i % 4 },
            { "bbb", "bbb" + i % 4 },
            { "ccc", "ccc" + i % 4 },
            { "ddd", "ddd" + i % 4 },
            { "eee", "eee" + i % 4 },
            { "fff", "fff" + i % 4 },
            { "ggg", "ggg" + i % 4 },
            { "hhh", "hhh" + i % 4 },
            { "iii", "iii" + i % 4 }
        };
    testData.Add(test);
}

我想在 Dictionary 中搜索 key、value 列表并返回包含我传递的 searchPattern 的 List&lt; Dictionary &lt; string, object &gt;&gt;

Dictionary<string, object> searchPattern = new Dictionary<string, object>();
searchPattern .Add("aaa", "aaa4");
searchPattern .Add("eee", "eee2");
searchPattern .Add("fff", "fff1");
searchPattern .Add("ddd", "ddd3");


public List<Dictionary<string, object>> SearchList(List<Dictionary<string, object>> testData, Dictionary<string, object> searchPattern)
{
    List<Dictionary<string, object>> result;

    // Search the list.

    return result;
}

任何其他搜索建议也很感激。 非常感谢!!

【问题讨论】:

  • 我不明白这个问题。您的示例的预期输出是什么?
  • 你期望返回什么结果?
  • @veredesmarald, @Cuong Le:在列表的 100 行中,我想搜索包含所有键值对“aaa”、“aaa4”和“eee”的行eee2" & "fff", "fff1" & "ddd", "ddd3" 并单独返回。
  • 您的测试数据中的字典都不包含所有这些键值对。
  • 当我看到这样的东西时,我想,嗯,这是可行的,但我感觉你一开始就做错了什么。

标签: c# list search .net-4.0 dictionary


【解决方案1】:

这将返回列表中包含搜索模式中所有键值对的第一个字典,如果没有,则返回 null

public Dictionary<string, object> SearchList
(
    List<Dictionary<string, object>> testData,
    Dictionary<string, object> searchPattern
)
{
    return testData.FirstOrDefault(x => searchPattern.All(x.Contains));
}

如果您想要所有匹配项(不仅仅是第一个匹配项),请使用 Where([...]).ToList() 而不是 FirstOrDefault([...])

【讨论】:

  • @RameshDurai 您不接受这个答案有什么原因吗?据我所知,它与您之后接受的其他答案的作用相同,但更干净?
  • 是的。你的回答很有效。但它只返回第一个值,我期望所有数据。 Where([...]).ToList() 应该可以工作。
  • @RameshDurai 我使用了FirstOrDefault,因为您的评论说“我想搜索包含所有键值对的行 [...] 并单独返回”...单独!=清单。
  • 我为我的错误道歉。在我明确提到的问题中。
【解决方案2】:

让我试试:

    public static List<Dictionary<string, object>> SearchList(List<Dictionary<string, object>> testData, Dictionary<string, object> searchPattern)
    {
        return testData.Where(t =>
            {
                bool flag = true;
                foreach (KeyValuePair<string, object> p in searchPattern)
                {
                    if (!t.ContainsKey(p.Key) || !t[p.Key].Equals(p.Value))
                    {
                        flag = false;
                        break;
                    }
                }
                return flag;
            }).ToList();

    }

    public static List<Dictionary<string, object>> SearchList(List<Dictionary<string, object>> testData, Dictionary<string, object> searchPattern)
    {
        return testData
                  .Where(t => searchPattern.All(p => t.ContainsKey(p.Key) && 
                                                     t[p.Key].Equals(p.Value)))
                  .ToList();
    }

【讨论】:

  • 谢谢!它的工作就像一个魅力:)
  • 很抱歉不接受您的回答。由于@veredesmarald 的回答也有效,而且他是第一个回答的人,我接受了他的回答。希望你会同意。
【解决方案3】:

如果我理解正确的话:

var result = testData.Where(dic => searchPattern.All(dic.Contains))
                     .ToList();

【讨论】:

  • 我期待 List> 类型的结果,但它返回 IEnumerable>。
  • @RameshDurai:好的,您需要的结果中每个字典中的数据是什么?
  • 请查看 veredesmarald 和 Konstantin Vasilcov 的答案。
  • @RameshDurai:我还是不明白你期待什么结果?跟随 veredesmarald,结果为零?
【解决方案4】:

有几种方法可以做到这一点。 _Individuals1 = file1.fileIndividuals; _Individuals2 = file2.fileIndividuals;

    foreach (KeyValuePair<int, Individual> kvpInd in _Individuals1) 
    { 
        foreach (KeyValuePair<int, Individual> kvpInd2 in _Individuals2) 
        { 
            if (kvpInd.Value.name.name == kvpInd2.Value.name.name) 
            { 
                similarInds.Add(kvpInd.Key, kvpInd.Value); 
            } 
        } 
    } 

var similarInds = file1.fileIndividuals. 
Where(kv1 => file2.fileIndividuals.Any(kv2 => kv1.Value.name.name == kv2.Value.name.name)). 
ToDictionary(kv => kv.Key, kv => kv.Value); 

如果您使用 linq 有重复的值,这将失败,您可以这样做

【讨论】:

    【解决方案5】:

    我同意 armen.shimoon,不过是这样的:

    public static List<Dictionary<string, object>> SearchList(this List<Dictionary<string, object>> list,
            Dictionary<string, object> searchPattern)
        {
            return list.Where(item =>
                searchPattern.All(x => item.ContainsKey(x.Key) && 
                    x.Value.Equals(item[x.Key])
                )).ToList();
        }
    

    然后像这样使用:

        searchResult = testData.SearchList(searchPattern);
    

    【讨论】:

    • 你不认为这个答案之前已经提到过吗?......甚至一次都没有
    猜你喜欢
    • 2013-05-15
    • 2018-01-25
    • 2023-03-15
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多