2008-12-12 27 views

Trả lời

16

Cách đơn giản nhất để làm điều này là:

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

Nhưng điều này không phải là đặc biệt hiệu quả nếu nó thực sự là một bộ sưu tập chung vì IEnumerator thực hiện IDisposable, vì vậy trình biên dịch có để đưa vào một thử/cuối cùng, với một Dispose() gọi trong khối cuối cùng.

Nếu đó là một bộ sưu tập không chung chung, hoặc bạn biết bộ sưu tập chung thực hiện không có gì trong phương thức Dispose() của nó, thì sau đây có thể được sử dụng:

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

Nếu bạn biết nếu có thể thực hiện IList, bạn có thể thực hiện việc này:

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; 
} 

Tương tự như vậy, nếu có khả năng nó sẽ thuộc loại định nghĩa của riêng bạn, bạn có thể sử dụng cùng một kỹ thuật.

3

Nếu không có Generics và vì ICollection cụ IEnumerable bạn có thể làm như trong ví dụ 1. Với Generics bạn đơn giản cần phải làm như ví dụ 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

dụ 2 không phải là đúng vì ICollection không thực hiện phương pháp đơn(). –

+0

Đây là một phương pháp mở rộng LINQ. Hãy xem tại msdn doc: http://msdn.microsoft.com/en-us/library/y2fx0ty0.aspx –

62

LINQ, baby, yeah ...

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 được định nghĩa trên ICollection hoặc IEnumerable (không chung chung)? Ở đâu? Điều gì sẽ làm việc mặc dù: myICollection.OfType () .FirstOrDefault(); –

+0

Đúng, cập nhật. Cảm ơn. – Will

+3

Đây là câu trả lời đúng. Đầu tiên và FirstOrDefault thậm chí sử dụng tối ưu hóa IList nội bộ nếu có thể. –

0

.

collection.ToArray()[i] 

Bằng cách này là chậm, nhưng rất đơn giản để sử dụng

+2

Bản sao này chỉ sao chép toàn bộ bộ sưu tập để có được một giá trị. – Matt

+1

"Chúng tôi biết Bộ sưu tập là trống ngoài việc đó". Vì lợi ích của sự đơn giản, ở trên sẽ có sử dụng của nó. Mặc dù không phải là câu trả lời chung tốt nhất vì nó sẽ bị lạm dụng. – Skarsnik

Các vấn đề liên quan