5

次のようなList< Dictionary < string, object >>変数があります。

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);
}

ディクショナリでキー、値のリストを検索し、List< Dictionary < string, object >>渡した searchPattern を含むものを返したいと思います。

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;
}

検索するための他の提案も高く評価されています。どうもありがとう!!

4

5 に答える 5

1

私があなたを正しく理解していれば:

var result = testData.Where(dic => searchPattern.All(dic.Contains))
                     .ToList();
于 2012-09-13T04:30:38.813 に答える
1

私が試してみましょう:

    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();
    }
于 2012-09-13T04:14:16.580 に答える
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([...]).

于 2012-09-13T04:21:25.937 に答える
0

私は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);
于 2012-09-13T04:34:12.850 に答える
0

これを行うにはいくつかの方法があります。_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 を使用して値が重複している場合、これは失敗します。このようにすることができます

于 2012-09-13T04:20:07.637 に答える