C# 如何获取IEnumerable的第一个元素

C# 如何获取IEnumerable的第一个元素,c#,.net,ienumerable,linq-to-objects,html-lists,C#,.net,Ienumerable,Linq To Objects,Html Lists,是否有更好的方法获取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.

是否有更好的方法获取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();

扩展名
.First()
将获取可枚举项中的第一项。如果集合为空,它将引发异常
.FirstOrDefault()
将为空集合返回默认值(对于引用类型为null)。明智地选择你的武器

如果不能使用LINQ,也可以通过
imgList.GetEnumerator()直接获取枚举数。
然后执行
.MoveNext()
移动到第一个元素。
.Current
将为您提供第一个元素。

可能与您当前的情况稍不相关,但还有一个
.Single()
和一个
.SingleOrDefault()
返回第一个元素,如果集合中没有一个元素(
.Single()
)则引发异常或者如果集合中有多个元素(
.SingleOrDefault()


如果您的逻辑依赖于列表中只有一个(或零个)对象,那么这些将非常有用。尽管我怀疑它们不是您想要的。

我遇到了一个问题,我将数据源从bindingsource更改为实体框架查询

var query = dataSource as IQueryable;
var value = query.Where("prop = @0", value).Cast<object>().SingleOrDefault();
结合使用反射的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<MethodInfo> singleOrDefaultMethod 
         = new Lazy<MethodInfo>(() =>
             typeof(Extensions).GetMethod(
                 "SingleOrDefault", BindingFlags.Static | BindingFlags.NonPublic));

    private static T SingleOrDefault<T>(IEnumerable<T> enumerable)
    {
        return enumerable.SingleOrDefault();
    }
公共静态对象SingleOrDefault(此IEnumerable可枚举,类型)
{
var method=singleOrDefaultMethod.Value.MakeGenericMethod(新[]{type});
Invoke(null,new[]{enumerable});
}
私有静态惰性singleOrDefaultMethod
=新懒惰(()=>
typeof(扩展名).GetMethod(
“SingleOrDefault”,BindingFlags.Static(BindingFlags.NonPublic));
私有静态T SingleOrDefault(IEnumerable可枚举)
{
返回可枚举的.SingleOrDefault();
}

您可以随意对每种类型实施缓存以提高性能。

为什么不使用泛型
IEnumerable
以便
ImageList
可以派生自
IEnumerable
?@Arnis:因为ImageMagick.net库中的ImageList定义…)@标记,是必需的。。我们不能只使用“var firstImage=ImgList.First()”吗?@Ramesh:
Cast
在这种情况下是必需的,因为
First
是为
IEnumerable
实现的,但是
ImageList
只实现
IEnumerable
@Ramesh-Vel,你不能使用ImgList.First(),因为它在施放之前不是通用的IEnumerable。@Brian,@jonC,抱歉,伙计们,我没有意识到“ImageList只实现IEnumerable”:(事实上,我非常了解Linq,但是
IEnumerable
很混乱,因为它经常使用
IEnumerable
)。
var query = dataSource as IQueryable;
var targetType = query.GetType().GetGenericArguments()[0];
var value = query.Where("prop = @0", value).SingleOrDefault(targetType);
    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<MethodInfo> singleOrDefaultMethod 
         = new Lazy<MethodInfo>(() =>
             typeof(Extensions).GetMethod(
                 "SingleOrDefault", BindingFlags.Static | BindingFlags.NonPublic));

    private static T SingleOrDefault<T>(IEnumerable<T> enumerable)
    {
        return enumerable.SingleOrDefault();
    }