Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查询词典?_C#_.net_Linq_List_Dictionary - Fatal编程技术网

C# 查询词典?

C# 查询词典?,c#,.net,linq,list,dictionary,C#,.net,Linq,List,Dictionary,你能告诉我如何查询词典和/或列表词典吗 private Dictionary<string, Dictionary<DateTime, double>> masterDict= new Dictionary<string, Dictionary<DateTime, double>>(); Private Dictionary<string, List<DateTime>> masterList= new Dictionar

你能告诉我如何查询词典和/或列表词典吗

private Dictionary<string, Dictionary<DateTime, double>> masterDict= new Dictionary<string, Dictionary<DateTime, double>>();

Private Dictionary<string, List<DateTime>> masterList= new Dictionary<string, List<DateTime>>();
感谢您的关注

在每个kvp中使用masterDict.Values

值是每个masterDict条目的内部字典,即字典

所以,只要foreach也超过kvp.Value,就可以得到内部值

e、 g

这个是:

var masterDictionary = new Dictionary<string, Dictionary<DateTime, double>>(); 

var query =
  from kvp1 in masterDictionary
  from kvp2 in kvp1.Value
  select new {TheString = kvp1.Key, TheDate = kvp2.Key, TheDouble = kvp2.Value };

foreach(var x in query)
{
  Console.WriteLine("{0} {1} {2}", x.TheString, x.TheDate, x.TheDouble);
}
另一个是:

var masterList= new Dictionary<string, List<DateTime>>(); 

var query =
  from kvp in masterList
  from val in kvp.Value
  select new {TheString = kvp.Key, TheDate = val);

foreach(var x in query)
{
  Console.WriteLine("{0} {1}", x.TheString, x.TheDate);
}

您询问了列表、词典和包含其他词典的词典

 foreach (var kvp in masterDictMethod())
        {
            Console.WriteLine("Key = {0}, Value = {1}",
                kvp.Key, kvp.Value);
        }
我最近也有一个类似的主题,我希望有一个可查询的字典,即一个扩展方法,它允许将查询表达式作为lambda参数传递,您可以像这样使用:

var result = myDictionary.QueryDictionary(w => myList.Any(a => a == w.Key));
此代码行的目的是检查myList中是否包含字典的任何键

所以我所做的是,我编写了以下扩展方法:

// extension method using lambda parameters
public static Dictionary<string, T> QueryDictionary<T>(
    this Dictionary<string, T> myDict, 
    Expression<Func<KeyValuePair<string,T>, bool>> fnLambda)
{
    return myDict.AsQueryable().Where(fnLambda).ToDictionary(t => t.Key, t => t.Value);
}
结果将包含项目a和b,因为它们包含在列表1中

您也可以查询字典字典,这是一个C示例,但它也可以用作控制台应用程序,只需注释掉.Dump语句并用console.WriteLine替换它们即可。。。声明:

void Main()
{
    // *** Set up some data structures to be used later ***
    var list1 = new List<string>() { "a", "b", "d" }; // a list
    var myDict = new Dictionary<string, object>(); // the dictionary
    myDict.Add("a", "123"); myDict.Add("b", "456"); myDict.Add("c", "789"); 

    var myDict2 = new Dictionary<string, object>(); // 2nd dictionary
    myDict2.Add("a", "123"); myDict2.Add("b", "456"); myDict2.Add("c", "789"); 

    myDict.Add("d", myDict2); // add 2nd to first dictionary

    // *** 1. simple query on dictionary myDict ***
    var q1 = myDict.QueryDictionary(w => list1.Any(a => a == w.Key));
    q1.Dump();

    // *** 2. query dictionary of dictionary (q3 contains result) ***
    var q2 = 
      (Dictionary<string, object>)q1.QueryDictionary(w => w.Key.Equals("d")).First().Value; 
    var q3 = q2.QueryDictionary(w => w.Key.Equals("b"));
    q3.Dump();
}

// *** Extension method 'QueryDictionary' used in code above ***
public static class Extensions
{
    public static Dictionary<string, T> QueryDictionary<T>(
       this Dictionary<string, T> myDict, 
       Expression<Func<KeyValuePair<string, T>, bool>> fnLambda)
    {
        return myDict.AsQueryable().Where(fnLambda).ToDictionary(t => t.Key, t => t.Value);
    }
}

由于此解决方案使用泛型,您可以将任何lambda表达式作为搜索参数传递,因此它非常灵活。

最好这样做:masterDict{/*中的foreach var kv使用kv.Value-内部dict.*/}。这将保存内部查找字典实现IEnumerable。您知道用扩展方法而不是查询来实现吗?@MGG\u Soft是的,您正在查找Enumerable.SelectMany的重载之一
// extension method using lambda parameters
public static Dictionary<string, T> QueryDictionary<T>(
    this Dictionary<string, T> myDict, 
    Expression<Func<KeyValuePair<string,T>, bool>> fnLambda)
{
    return myDict.AsQueryable().Where(fnLambda).ToDictionary(t => t.Key, t => t.Value);
}
var list1 = new List<string>() { "a", "b" };
var myDict = new Dictionary<string, object>();
myDict.Add("a", "123"); myDict.Add("b", "456"); myDict.Add("c", "789"); 

var result = myDict.QueryDictionary(w => list1.Any(a => a == w.Key));
void Main()
{
    // *** Set up some data structures to be used later ***
    var list1 = new List<string>() { "a", "b", "d" }; // a list
    var myDict = new Dictionary<string, object>(); // the dictionary
    myDict.Add("a", "123"); myDict.Add("b", "456"); myDict.Add("c", "789"); 

    var myDict2 = new Dictionary<string, object>(); // 2nd dictionary
    myDict2.Add("a", "123"); myDict2.Add("b", "456"); myDict2.Add("c", "789"); 

    myDict.Add("d", myDict2); // add 2nd to first dictionary

    // *** 1. simple query on dictionary myDict ***
    var q1 = myDict.QueryDictionary(w => list1.Any(a => a == w.Key));
    q1.Dump();

    // *** 2. query dictionary of dictionary (q3 contains result) ***
    var q2 = 
      (Dictionary<string, object>)q1.QueryDictionary(w => w.Key.Equals("d")).First().Value; 
    var q3 = q2.QueryDictionary(w => w.Key.Equals("b"));
    q3.Dump();
}

// *** Extension method 'QueryDictionary' used in code above ***
public static class Extensions
{
    public static Dictionary<string, T> QueryDictionary<T>(
       this Dictionary<string, T> myDict, 
       Expression<Func<KeyValuePair<string, T>, bool>> fnLambda)
    {
        return myDict.AsQueryable().Where(fnLambda).ToDictionary(t => t.Key, t => t.Value);
    }
}