C# 如何获取IEnumerable的第一个元素
是否有更好的方法获取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.
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();
}