Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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# 我可以依赖Linq中SortedDictionary的顺序吗?它能有效地完成这项工作吗?_C#_.net_Linq_Linq To Objects - Fatal编程技术网

C# 我可以依赖Linq中SortedDictionary的顺序吗?它能有效地完成这项工作吗?

C# 我可以依赖Linq中SortedDictionary的顺序吗?它能有效地完成这项工作吗?,c#,.net,linq,linq-to-objects,C#,.net,Linq,Linq To Objects,当在Linq中使用SortedDictionary并对它提供的KeyValuePair进行迭代时,我能保证复杂的Linq查询将以升序执行它吗?下面是一个简短但有点混乱的示例: Random r = new Random(); //build 100 dictionaries and put them into a sorted dictionary //with "priority" as the key and it is a number 0-99. SortedDictionary<

当在Linq中使用SortedDictionary并对它提供的KeyValuePair进行迭代时,我能保证复杂的Linq查询将以升序执行它吗?下面是一个简短但有点混乱的示例:

Random r = new Random();
//build 100 dictionaries and put them into a sorted dictionary
//with "priority" as the key and it is a number 0-99.
SortedDictionary<int, Dictionary<int, double>> sortedDict = 
    new SortedDictionary<int, Dictionary<int, double>>();
for (int i = 0; i < 100; i++)
{
    Dictionary<int, double> dict = new Dictionary<int, double>();
    //create the dictionary and a random 10 k/v pairs
    for (int j = 0; j < 10; j++)
    {
        dict[r.Next(0, 100)] = r.NextDouble() * i * 10;
    }
    sortedDict[i] = dict;
}

IEnumerable<int> keys = Enumerable.Range(0, 100);

//the goal is to find the FIRST existence of the "key" inside one
//of the inner dictionaries going through the SortedDictionary IN ORDER
//this appears to work:
var qry = from key in keys
          from priority in sortedDict
          where priority.Value.ContainsKey(key)
          let value = priority.Value[key]
          group value by key into keyGroup
          let firstValue = keyGroup.First()
          select new { Key = keyGroup.Key, Value = firstValue };

// the result is as expected, a list of the numbers at most 0-99 and their
// value found in the dictionary with the lowest "priority"
Random r=new Random();
//建立100个字典,并将它们放入一个已排序的字典中
//以“优先级”为键,它是一个数字0-99。
SortedDictionary sortedDict=
新的SortedDictionary();
对于(int i=0;i<100;i++)
{
Dictionary dict=新字典();
//创建字典和随机的10个k/v对
对于(int j=0;j<10;j++)
{
dict[r.Next(0100)]=r.NextDouble()*i*10;
}
sortedDict[i]=dict;
}
IEnumerable键=可枚举的范围(0,100);
//我们的目标是找到其中第一个“钥匙”的存在
//按顺序通过分类词典的内部词典
//这似乎有效:
var qry=从键输入键
从sortedDict中的优先级
其中priority.Value.ContainsKey(键)
让值=优先级。值[键]
按键将值分组为键组
让firstValue=keyGroup.First()
选择新{Key=keyGroup.Key,Value=firstValue};
//结果和预期的一样,一个最多0-99个数字的列表以及它们的
//在字典中找到具有最低“优先级”的值
问题:

  • 它似乎有效,但我可以依靠这种行为吗
  • 这是有效的,还是团队放弃了它
  • 添加“sortedct.Reverse()”是否也能正常工作?(似乎)
  • PLinq将如何处理这一点?它是否仍然是一致的
  • 如果不能保证这一点,我知道如何将“优先级”拉入分组并在事后按其排序。但我不想

  • 是的,你可以。SortedDictionary无法取消排序。它保证保持排序,即使它抛出异常
  • 随着排序的进行,它变得越来越有效。你可以通过使用什么类型的领域知识等来更有效地实现这一点,但在99,99%的情况下,这是非常不值得的
  • 是:)
  • 看来我错了,plinq在订购方面有问题。见乔恩的帖子
  • 是的,你可以。SortedDictionary无法取消排序。它保证保持排序,即使它抛出异常
  • 随着排序的进行,它变得越来越有效。你可以通过使用什么类型的领域知识等来更有效地实现这一点,但在99,99%的情况下,这是非常不值得的
  • 是:)
  • 看来我错了,plinq在订购方面有问题。见乔恩的帖子
  • 是的,您可以相信SortedDictionary的顺序。否则将毫无意义:)
  • 如果没有“let”条款,效率会稍微高一些。只要做:

    var qry = from key in keys
              from priority in sortedDict
              where priority.Value.ContainsKey(key)
              let value = priority.Value[key]
              group value by key into keyGroup
              select new { Key = keyGroup.Key, Value = keyGroup.First() };
    
    然而,你仍然在用这个浏览字典。你基本上不想要一个从键到包含该键的优先级的反向映射吗?这可以更有效地构建。正如你所说,这个例子相当混乱。如果您能告诉我们您在实际代码中想要实现什么,我们可能会想出更好的方法。(如果确实是这种情况,我当然可以解决它——我宁愿不这样做,然后发现现实是非常不同的!)

  • 调用Reverse()确实会起作用,但它会缓冲所有数据。如果你想让它以相反的顺序,我建议你给SortedDictionary一个合适的IComparator开始

  • 当谈到顺序时,并行LINQ是“有趣的”。现在可能不一样了,但当我用它绘制Mandelbrot集时

  • 是的,您可以相信SortedDictionary的顺序。否则将毫无意义:)
  • 如果没有“let”条款,效率会稍微高一些。只要做:

    var qry = from key in keys
              from priority in sortedDict
              where priority.Value.ContainsKey(key)
              let value = priority.Value[key]
              group value by key into keyGroup
              select new { Key = keyGroup.Key, Value = keyGroup.First() };
    
    然而,你仍然在用这个浏览字典。你基本上不想要一个从键到包含该键的优先级的反向映射吗?这可以更有效地构建。正如你所说,这个例子相当混乱。如果您能告诉我们您在实际代码中想要实现什么,我们可能会想出更好的方法。(如果确实是这种情况,我当然可以解决它——我宁愿不这样做,然后发现现实是非常不同的!)

  • 调用Reverse()确实会起作用,但它会缓冲所有数据。如果你想让它以相反的顺序,我建议你给SortedDictionary一个合适的IComparator开始

  • 当谈到顺序时,并行LINQ是“有趣的”。现在可能不一样了,但当我用它绘制Mandelbrot集时

  • 下面是一个关于linq方法保持顺序的例子

    查看查询时,您似乎有:

      keys.SelectMany(...)
        .Where(...)
        .GroupBy(...)
        .Select(g => g.First())
        .Select(...);
    
    所有这些都将以某种方式保持顺序。

    下面是一个关于linq方法保持顺序的示例

    查看查询时,您似乎有:

      keys.SelectMany(...)
        .Where(...)
        .GroupBy(...)
        .Select(g => g.First())
        .Select(...);
    

    所有这些都将以某种方式保持顺序。

    实际代码一如既往地更加复杂。我可能会提出另一个问题,因为它不是直接相关的,真正的代码,一如既往,更复杂。我可能会提出另一个问题,因为这不是直接相关的