2015-02-24 9 views
2

Я бы хотел позвонить по телефону IDatabase.SortedSetAsync (StackExchange.Redis). Сигнатура для этого метода является:Как передать массив методу StackExchange.Redis с помощью команды RedisValue []?

Task<bool> SortedSetRemoveAsync(RedisKey key, RedisValue member, 
     CommandFlags flags = CommandFlags.None); 
Task<long> SortedSetRemoveAsync(RedisKey key, RedisValue[] members, 
     CommandFlags flags = CommandFlags.None); 

У меня нет никакой проблемы, проходящей одно значение (например, строки), который получает неявно преобразуется в RevisValue. Однако, если я пытаюсь переходящая в массиве ...

var key = "MYKEY"; 
var values = new string[] { "A", "B", "C" }; 

await database.SortedSetRemoveAsync(key, values); 

... то компилятор не имеет ни малейшего представления о том, как преобразовать строку [] в RedisValue [].

Единственный способ, которым я управлял преобразование, сделав преобразование каждого товара:

var values2 = values.Select(s => (Redisvalue) s).ToArray(); 
await database.SortedSetRemoveAsync(key, values2); 

... и я не уверен, является ли это лучший способ сделать это.

Очень странно, что передать массив, когда есть методы API, ожидающие массивы ... unit tests принять легкое направление, пройдя пустым массивом RedisValue [] и обойдя проблему в целом.

Каков рекомендуемый способ передачи аргументов массива методам StackExchange.Redis, принимающим RedisValue [] массивы?

ответ

8

Правило выбора правильное, но было бы более эффективно использовать Array.ConvertAll, поскольку он знает элементы массива и может выполнять итерацию по индексу.

var values = new string[] { "A", "B", "C" }; 
var redisValues = Array.ConvertAll(values, item => (RedisValue)item); 

Примечание Вы также можете создать список, как

RedisValue[] values = { "A", "B", "C" }; 
Смежные вопросы