不可用的concat不适用于每个循环

时间:2016-09-02 14:06:56

标签: c# linq c#-4.0

我正在尝试在每个循环中使用IEnumerable中的Concat方法,但我无法使其正常工作。

IEnumerable<Geo> geos = null;
foreach (string a in values)
{
    if (geos == null)
        geos = entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a)));
    else
        geos = geos.Concat(entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a))));
}

它返回的只是值中最终“a”的值,对于值中存在的记录数也是如此。

因此,如果我有1,2,3作为值,它只返回3.我也需要1,2和3的值。

我哪里错了?

2 个答案:

答案 0 :(得分:6)

您可能正在使用旧版本的C#,在C#5(随Visual Studio 2013提供)中,他们更改了foreach的行为。在C#4中,a中的g => (g.ACode == Convert.ToInt16(a))将是la foreach的最后一个值,在C#5中更新,它将始终是当前值。

要获得C#5行为,您只需要在foreach循环的范围内声明一个额外的变量,并在捕获中使用它。

IEnumerable<Geo> geos = null;
foreach (string a in values)
{
    string b = a;
    if (geos == null)
        geos = entities.Geos.Where(g => (g.ACode == Convert.ToInt16(b)));
    else
        geos = geos.Concat(entities.Geos.Where(g => (g.ACode == Convert.ToInt16(b))));
}

如果您感到好奇,那么更改的内容就是C#4及以下原始代码被转换为

IEnumerable<Geo> geos = null;
using(IEnumerator<string> enumerator = values.GetEnumerator())
{
    string a;
    while(enumerator.MoveNext())
    {
        a = enumerator.Current;

        if (geos == null)
            geos = entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a)));
        else
            geos = geos.Concat(entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a))));
    }
}

在C#5及更新版本中,它被翻译为

IEnumerable<Geo> geos = null;
using(IEnumerator<string> enumerator = values.GetEnumerator())
{
    while(enumerator.MoveNext())
    {
        string a = enumerator.Current;

        if (geos == null)
            geos = entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a)));
        else
            geos = geos.Concat(entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a))));
    }
}

通过在C#4中执行string b = a;,我们重新创建了while循环内的声明行为。

答案 1 :(得分:1)

根据我的理解,你想要做的是拥有Geos的所有ACode。您可以这样做,而不是遍历每个Geos的{​​{1}}列表:

a