Я провел эксперимент с использованием образца Voting Web , и ключи, похоже, фильтруются в порядке их реализации IComparable
, с некоторыми оговорками:
- ItПохоже, что фильтр может быть запущен несколько раз с одним и тем же ключом
- Фильтр может применяться к элементам, которые были недавно удалены
VotingData.Controllers.VoteDataController
имеет следующие операции get и put дляперечислите и добавьте категории для голосования:
[HttpPut("{name}")]
public async Task<IActionResult> Put(string name)
{
IReliableDictionary<string, int> votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");
using (ITransaction tx = this.stateManager.CreateTransaction())
{
await votesDictionary.AddOrUpdateAsync(tx, name, 1, (key, oldvalue) => oldvalue + 1);
await tx.CommitAsync();
}
return new OkResult();
}
Я изменил Get
, чтобы перечислить по порядку votesDictionary
, и применил фильтр, который создает список ключей, видимых фильтром:
[HttpGet]
public async Task<IActionResult> Get()
{
CancellationToken ct = new CancellationToken();
IReliableDictionary<string, int> votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");
var filteredKeys = new List<string>();
using (ITransaction tx = this.stateManager.CreateTransaction())
{
IAsyncEnumerable<KeyValuePair<string, int>> list = await votesDictionary.CreateEnumerableAsync(tx, key =>
{
lock (this.locker)
{
filteredKeys.Add(key);
return true;
}
},
EnumerationMode.Ordered);
IAsyncEnumerator<KeyValuePair<string, int>> enumerator = list.GetAsyncEnumerator();
List<KeyValuePair<string, int>> result = new List<KeyValuePair<string, int>>();
while (await enumerator.MoveNextAsync(ct))
{
result.Add(enumerator.Current);
}
return this.Json(result);
}
}
Я добавил ключи в словарь в случайном алфавитном порядке и обновил страницу, чтобы выполнить запрос Get
.При каждом обновлении коллекция filteredKeys
содержала мои записи в отсортированном алфавитном порядке.Как уже упоминалось выше, коллекция иногда содержала повторяющиеся записи для определенных строк.Когда я удалил элементы из коллекции и обновил страницу, я обнаружил, что удаленные ключи все еще добавляются в filteredKeys
, хотя эти элементы не возвращаются в перечислении результатов.