Каков наилучший способ получить ценность от ICollection? Мы знаем, что Коллекция пуста, кроме этого.
С# ICollection получает одно значение
Ответ 1
Линк, детка, да...
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();
Ответ 2
Самый простой способ сделать это:
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;
}
Аналогично, если он, вероятно, будет определенного типа вашего собственного определения, имеющего определенный индексный доступ, вы можете использовать ту же технику.
Ответ 3
Без generics и потому что 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());
Ответ 4
.
collection.ToArray()[i]
Этот способ медленный, но очень простой в использовании