如何获得IEnumerable的第一个元素

是否有更好的方法来获取IEnumerable类型的第一个元素:

foreach (Image image in imgList) { picture.Width = (short)image.Columns; picture.Height = (short)image.Rows; break; } 

这是类型的确切声明:

 public class ImageList : IEnumerable, IDisposable 

 var firstImage = imgList.Cast().First(); 

如果你不能使用LINQ,你也可以通过imgList.GetEnumerator()直接获取枚举器然后执行.MoveNext()移动到第一个元素。 .Current然后会给你第一个元素。

扩展名.First()将获取可枚举中的第一项。 如果集合为空,则会抛出exception。 .FirstOrDefault()将返回.FirstOrDefault()的默认值(引用类型为null)。 明智地选择你的武器!

可能与您当前的情况稍微不相关,但是还有.SingleOrDefault() .Single().SingleOrDefault()返回第一个元素,如果集合中没有一个元素.SingleOrDefault()则抛出exception或者如果集合中有多个元素( .SingleOrDefault() )。

如果您的逻辑仅依赖于列表中的单个(或零)对象,则这些非常有用。 虽然我怀疑他们不是你想要的。

我有一个问题,我将数据源从绑定源更改为entity framework查询。

 var query = dataSource as IQueryable; var value = query.Where("prop = @0", value).Cast().SingleOrDefault(); 

使用entity framework会抛出exception“无法将类型’customer’强制转换为’object’。 LINQ to Entities仅支持转换EDM原语或枚举类型。

我的代码所在的类没有对模型的lib的引用,所以...Cast是不可能的。

无论如何我用这种方法

 var query = dataSource as IQueryable; var targetType = query.GetType().GetGenericArguments()[0]; var value = query.Where("prop = @0", value).SingleOrDefault(targetType); 

与使用reflection的IEnumerable扩展相结合

  public static object SingleOrDefault(this IEnumerable enumerable, Type type) { var method = singleOrDefaultMethod.Value.MakeGenericMethod(new[] { type }); return method.Invoke(null, new[] { enumerable }); } private static Lazy singleOrDefaultMethod = new Lazy(() => typeof(Extensions).GetMethod( "SingleOrDefault", BindingFlags.Static | BindingFlags.NonPublic)); private static T SingleOrDefault(IEnumerable enumerable) { return enumerable.SingleOrDefault(); } 

随意实现每种类型的缓存以提高性能。