Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我真的只是将字符串数据类型放入IEnumerable<;int>;_C#_Linq_Casting - Fatal编程技术网

C# 我真的只是将字符串数据类型放入IEnumerable<;int>;

C# 我真的只是将字符串数据类型放入IEnumerable<;int>;,c#,linq,casting,C#,Linq,Casting,好吧,这有点奇怪。忽略我试图做的事情,看看在这种情况下发生的事情的结果 代码: static string rawNumbers="1,4,6,20,21,22,30,34"; static IEnumerable<int> numbers = null; static void Main(string[] args) { numbers = rawNumbers.Split(',').Cast<int>(); for (int i = 0; i &l

好吧,这有点奇怪。忽略我试图做的事情,看看在这种情况下发生的事情的结果

代码:

static string rawNumbers="1,4,6,20,21,22,30,34";
static IEnumerable<int> numbers = null;

static void Main(string[] args)
{
    numbers = rawNumbers.Split(',').Cast<int>();

    for (int i = 0; i < numbers.Count(); i++)
    {
        //do something
    }

}
错误发生在cast上,当我查看
源代码
变量中的数据时,它是一个字符串[]

我会认为,由于我调用int的cast命令行成功执行,所以一切都很好。幕后发生了什么?字符串数组真的只是存储在某个地方,在调用它之前不会被转换为T吗?也许是懒散的演员



我知道我做不到:(int)“42”。我的问题不是如何让演员发挥作用,而是发生了什么。推迟演出?我调用
Cast()
的那一行似乎很奇怪,但实际上不起作用。

之所以
Cast
起作用,是因为调用方法时没有枚举
IEnumerable
,而是在调用
Count()
时。因此,调用
Cast()
实际上没有任何作用。一旦实际计算了强制转换,代码就会失败

不要尝试强制转换,只需做一个简单的转换

numbers = rawNumbers.Split(',').Select(str => int.parse(str));

有两点:首先,不能将
字符串
转换为
int
。您可以解析字符串并获得结果整数。但本质上,你正试图做到这一点:

int x = (int)"32";
这是个例外其次,LINQ运算符是延迟执行的,因此在您尝试迭代结果之前,实际上不会发生任何事情,而实际工作就是在这个时候开始的。


对于延迟执行,不检查您请求的操作是否有效或是否可以正确执行,它只是设置操作,然后在迭代时尝试单独执行。

我可能错了,但我想知道这是否与int和string之间的强制转换有关。当我忘记不能使用(int)对字符串进行强制转换,而必须使用int.Parse时,我总是会出错。这可能与此有关,但我对此一无所知。

Cast()
行中没有立即出现错误的原因是,请记住,这只是将操作序列链接起来。只有遍历集合后,才会执行转换

rawNumbers.Split(',')
立即发生,但是
Cast()
是延迟计算


如果您在该行中添加了ToList()或ToArray(),它将立即执行。

如前所述,“延迟执行”是这里的问题。许多LINQ运算符在迭代结果变量之前不会导致lambda代码实际执行


这样做的一个原因是允许您构建一系列可以同时执行的复杂操作,而不是作为一个单独的操作字符串。这可能是一件有用的事情,但如果你没有预料到的话,它也可能很棘手。

是的,找到一种让演员工作的方法不是我的问题。我只是好奇到底发生了什么事情,使它看起来很好,但事实并非如此,因为.Cast()和其他LINQ朋友在您调用它们时不执行它们的操作,而是创建迭代器,在枚举它们时执行操作。@Joe,我在回答的末尾添加了原因。他不是问为什么它不起作用,而是问为什么只有在迭代错误时才会出现错误,这是因为延迟执行。@BFree;很高兴你评论了cdhowie和Mike Cheel,让他们知道他们的答案“错”在哪里。不管是不是你做的,我认为否决票可能有点多,但我想这也说明了问题(如果加上你的评论的话)这是部分原因,但是.Cast()似乎工作正常的主要原因是,如果我可以这么说的话,它是“懒惰计算的”。然后,直到对IEnumerable求值,即访问
Count
属性时,才会调用转换。然后,在计算
Count
属性之前,它执行强制转换,并抛出,因为不能将字符串类型强制转换为int。@Andrew:是的,我是被否决的人,我这样做时总是添加注释。我只是觉得当有这样的问题时,问题的重点是“为什么这不起作用”,当人们发布解决方案时,我会发疯。这不是问题的目的…@BFree+1代表一般原则。不评论为什么有时感觉很好,但对获得投票的人很少有帮助:)我为你加粗了重要的部分:)谢谢,我注意到他编辑了问题并询问了延期执行的问题;不确定这是在我回答之前还是之后黑体的句子是唯一重要的一句,我认为延迟执行(或类似的事情)发生在正则表达式中的MatchCollections中。
int x = (int)"32";