如何将IEnumerable<int>转换为Int32

8
我有一个Linq查询,将返回一个整数结果。我想将其分配给Int32变量以供以后使用,但是我会收到一个错误消息,显示“int不包含RatingNumber的定义,并且没有接受类型为int的第一个参数的扩展方法RatingNumber(您是否缺少using指令或程序集引用?)”
这是调用查询的代码:
IEnumerable<int> newRatingNumber = getNewRecipeNumbers.newRatingNum();

        foreach (var a in newRatingNumber)
        {
            ratingNumber = a.RatingNum;
        }

这是查询语句:

 public IEnumerable<int> newRatingNum()
    {
        ratingTableAdapter.Fill(recipeDataSet.Rating);
        var newRatingNum = (from a in recipeDataSet.Rating
                            where a.UserRating == 0 &&
                            a.FamilyRating == 0 &&
                            a.HealthRating == 0 &&
                            a.EaseOfCooking == 0 &&
                            a.CookingTime == 0
                            select a.RatingNum);
        return newRatingNum;
    }

我尝试使用Convert.ToInt32将结果转换为整数,这样可以消除编译错误,但是会创建一个InvalidCastException异常。有没有任何想法?

谢谢帮助。

Craig

3个回答

26

Linq查询的结果不是单一的Int值,而是一个IEnumerable。因此您需要从中获取一个单一的值,在您的情况下是第一个值:

var newRatingNum = (from a in recipeDataSet.Rating
                        where a.UserRating == 0 &&
                        a.FamilyRating == 0 &&
                        a.HealthRating == 0 &&
                        a.EaseOfCooking == 0 &&
                        a.CookingTime == 0
                        select a.RatingNum).FirstOrDefault();

FirstOrDefault() 返回可枚举序列中的第一个值,如果序列为空,则返回0。


看起来这个会起作用,我需要将方法的返回类型更改为int,但现在我没有任何编译器错误。 - Craig Smith
由于Int32是值类型,所以当可枚举对象为空时,FirstOrDefault将返回0而不是null,因为它使用default(T),而default(Int32)为0。 - Andrew Sklyarevsky

3

如果你有一个 List<Int32>,理论上你可能会有多个元素。你可以使用 First()Last() 或者 Single() 来获取列表中的单个元素。它们都有 OrDefault() 版本,如果列表为空则返回 0,否则会出现错误。


0

你不能使用 Single 或 First 方法来隔离一个 Int32 吗?当你只需要一个时,IEnumerable 隐含了许多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接