Dim Result As String
Dim Items As New List(Of String)
Items.Add("Hello")
Items.Add("World")
Result = String.Join(",", Items.ToArray())
MessageBox.Show(Result)
, Если Вы действительно обеспокоены пустыми строками, используйте эту функцию соединения:
Function Join(ByVal delimiter As String, ByVal items As IEnumerable(Of String), Optional ByVal IgnoreEmptyEntries As Boolean = True) As String
Dim delim As String = ""
Dim result As New Text.StringBuilder("")
For Each item As String In items
If Not IgnoreEmptyEntries OrElse Not String.IsNullOrEmpty(item) Then
result.Append(delim).Append(item)
delim = delimiter
End If
Next
Return result.ToString()
End Function
Вызов Add () в кеш-памяти в конечном итоге вызывает внутренний метод с такой сигнатурой:
internal abstract CacheEntry UpdateCache(CacheKey cacheKey,
CacheEntry newEntry, bool replace, CacheItemRemovedReason removedReason,
out object valueOld);
Обратите внимание на out object valueOld
- это значение устанавливается для текущего объекта. в месте "cacheKey" в кэше и возвращается как результат Add (). Документация вводит в заблуждение, это на самом деле не тот же объект , который возвращается - это какой бы объект ни находился в этом том же ключевом месте.
Это легко проверить с помощью следующего кода:
String x = "lorem";
String y = "ipsum";
HttpContext.Current.Cache.Add("hi", x, null, DateTime.MaxValue,
Cache.NoSlidingExpiration,
CacheItemPriority.Normal, null);
var z = HttpContext.Current.Cache.Add("hi", y, null, DateTime.MaxValue,
Cache.NoSlidingExpiration,
CacheItemPriority.Normal, null);
//Result:
// z == "lorem"
Если вызов метода Add успешно добавляет элемент, он возвращает null.
Если ключ уже существует в кеше, метод возвращает объект. Однако в документации не говорится, возвращает ли он объект, который вы пытались поместить в кеш, или объект, уже сохраненный в кеше.
По логике, он должен возвращать объект, уже находящийся в кеше, поскольку это единственная информация это интересно. У вас уже есть ссылка на объект, который вы пытаетесь поместить в кеш.
Он возвращает объект только в том случае, если тот же объект уже был сохранен в кэше ( под другим ключом, я думаю под тем же ключом). В противном случае возвращается ноль. Документация вводит в заблуждение:
http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx
Глядя на это в Reflector, оба метода, кажется, вызывают тот же внутренний метод, при этом ADD возвращает старый объект, ранее сохраненный под тем же ключом, а метод INSERT просто игнорирует это значение.
Чтобы сделать это еще яснее, вот консольное приложение, которое демонстрирует точное поведение:
static void Main(string[] args)
{
string key = "key";
HttpRuntime.Cache.Add(key, "first", null/*no depends*/, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null/*no callback*/);
var addResult = HttpRuntime.Cache.Add(key, "second", null/*no depends*/, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null/*no callback*/);
Console.WriteLine("addResult = {0}", addResult);
Console.WriteLine("Cache[key] = {0}", HttpRuntime.Cache[key]);
}
И вывод консоли:
addResult = first Cache[key] = first
«Второй» вызов .Add
возвращает то, что в данный момент находится в кэше под нашим ключом, и не может обновить запись!