Каков наилучший способ получить значение от ICollection? Мы знаем, что Коллекция пуста, кроме этого.C# ICollection получить одно значение
ответ
Самый простой способ сделать это:
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;
}
Точно так же, если он, скорее всего, это будет иметь определенный тип вашего собственного определения, что есть какой-то индексированный доступ, вы можете использовать ту же технику.
Без дженериков и потому 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());
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();
FirstOrDefault определен на ICollection или IEnumerable (non-generic)? Где? Что будет работать: myICollection.OfType
.
collection.ToArray()[i]
Таким образом, медленно, но очень простой в использовании
пример 2 не является правильным, потому что ICollection не реализует метод Single(). – 2008-12-12 17:18:25
Это метод расширения Linq. Взгляните на документ msdn: http://msdn.microsoft.com/en-us/library/y2fx0ty0.aspx – 2008-12-12 17:26:54