При использовании SortedDictionary в Linq и итерации по 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"
Вопрос (ы):
- Кажется, это работает, но я могу положиться на это поведение?
- Это эффективно, или группа скинула это?
- Правильно ли работает добавление sortedDict.Reverse ()? (кажется)
- Как PLinq справится с этим - и будет ли он по-прежнему согласованным?
Если это не гарантировано, я знаю, как я могу вытянуть «приоритет» в группировку и упорядочить ее по факту. Но я бы предпочел не ...