2008-12-12 2 views

ответ

16

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

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

Но это не особенно эффективно, если это на самом деле общий сбор, потому что IEnumerator реализует IDisposable, так что компилятор должен положить в попытке /, наконец, с вызов 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

Без дженериков и потому 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()); 
+0

пример 2 не является правильным, потому что ICollection не реализует метод Single(). – 2008-12-12 17:18:25

+0

Это метод расширения Linq. Взгляните на документ msdn: http://msdn.microsoft.com/en-us/library/y2fx0ty0.aspx – 2008-12-12 17:26:54

62

Linq, детка, да ...

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

FirstOrDefault определен на ICollection или IEnumerable (non-generic)? Где? Что будет работать: myICollection.OfType () .FirstOrDefault(); – 2008-12-12 17:42:31

0

.

collection.ToArray()[i] 

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