如何获得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
使用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(); }
随意实现每种类型的缓存以提高性能。