Подтвердить что ты не робот

С# ICollection получает одно значение

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

4b9b3361

Ответ 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]

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