ICollection - получить одно значение

Каков наилучший способ получить значение от ICollection? Мы знаем, что Коллекция пуста кроме этого.

12.12.2008 16:42:36
5 ОТВЕТОВ

Самый простой способ сделать это:

foreach(object o in collection) {
  return o;
}

Но это не особенно эффективно, если это на самом деле универсальная коллекция, потому что IEnumerator реализует IDisposable, поэтому компилятор должен добавить try / finally с вызовом Dispose () в блоке finally.

Если это не универсальная коллекция, или вы знаете, что универсальная коллекция ничего не реализует в своем методе Dispose (), то можно использовать следующее:

IEnumerator en = collection.GetEnumerator();
en.MoveNext();
return en.Current;

Если вы знаете, может ли реализовать IList, вы можете сделать это:

IList iList = collection as IList;
if (iList != null) {
  // Implements IList, so can use indexer
  return iList[0];
}
// Use the slower way
foreach (object o in collection) {
  return o;
}

Аналогично, если вероятно, что это будет определенный тип вашего собственного определения, который имеет какой-то индексированный доступ, вы можете использовать ту же технику.

22
12.12.2008 17:34:51

Без дженериков и потому, что ICollectionреализует, IEnumerableвы можете сделать как в примере 1. С дженериками вам просто нужно сделать как в примере 2:

List<string> l = new List<string>();
l.Add("astring");

ICollection col1 = (ICollection)l;
ICollection<string> col2 = (ICollection<string>)l;

//example 1
IEnumerator e1 = col1.GetEnumerator();
if (e1.MoveNext())
    Console.WriteLine(e1.Current);

//example 2
if (col2.Count != 0)
    Console.WriteLine(col2.Single());
3
12.12.2008 17:14:40
Пример 2 неверен, потому что ICollection не реализует метод Single ().
Udo Weber 12.12.2008 17:18:25
Это метод расширения Linq. Взгляните на документ MSDN
bruno conde 12.12.2008 17:26:54

Линк, детка, да ...

   var foo = myICollection.OfType<YourType>().FirstOrDefault();
    // or use a query
    var bar = (from x in myICollection.OfType<YourType>() where x.SomeProperty == someValue select x)
       .FirstOrDefault();
79
17.04.2015 16:09:55
FirstOrDefault определяется на ICollection или IEnumerable (не универсальный)? Куда? Что будет работать, хотя: myICollection.OfType <YourType> (). FirstOrDefault ();
Christoph Rüegg 12.12.2008 17:42:31
Это правильный ответ. First и FirstOrDefault даже используют эту оптимизацию IList внутри, где это возможно.
Daniel Earwicker 12.12.2008 23:46:19

,

collection.ToArray()[i]

Этот способ медленный, но очень простой в использовании

3
10.02.2014 22:16:58
Это копирует всю коллекцию только для того, чтобы получить одно значение.
Matt 10.02.2014 22:38:36
«Мы знаем, что Коллекция пуста, кроме этого». Для простоты вышеприведенное будет иметь свое применение. Хотя не самый лучший общий ответ, поскольку он будет злоупотреблять.
Skarsnik 8.03.2016 00:30:42

Если вы знаете, что в вашей коллекции есть только один элемент, и когда-либо только один элемент, вы можете использовать метод расширения Linq Single().

Это преобразует объект ICollection<T>в Tобъект, содержащий единственный элемент этой коллекции. Если длина коллекции равна 0, или больше, чем один, это бросит InvalidOperationException.

-1
1.04.2018 09:42:53