针对填充列表的C#foreach返回null

Dil*_*ave 5 c# foreach xamarin.android

在进行了一些重大的重构(转向PCL)之后,我有一些代码(它不是重构的一部分)运行正常,但现在抛出了异常.

该代码是Xamarin Android项目的一部分,该项目在移动到可移植类库之前使用文件链接.

这是一件简单的事情,但我不明白为什么会这样

foreach(var station in stationList)
{

    // Breakpoint on next line shows station to be null..!
    if(station.ClusterId != Guid.Empty)
    {
        // Code in here
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是虽然stationList包含许多StationViewModel对象,但station实例总是为空 - 这怎么可能呢?

我曾尝试更换foreach一个for循环,但结果却是相同的- station为空.

我还重新启动了Visual Studio并重新启动.

没有Xamarin更新似乎很出色.

代码运行正常,生成stationList并没有改变,也没有这个类的实现.

编辑:stationList创建过程是:

  1. 在PCL中调用SQLite'repo'返回(已填充)IList<station>

    _loadedStations = await _stationManager.GetStationsAsync();

  2. 使用AutoMapper 从上面的列表生成一个新的(正确填充)List<StationViewModel>

    fullStationList = AutoMapper.Mapper.Map<IList<Station>, IList<StationViewModel>>(_loadedStations);

  3. 在单独的方法中,上面的视图模型列表基于LatLng坐标进行过滤.

    var stationList = fullStationList.Where(x => mapBounds.Contains(new LatLng(x.Latitude, x.Longitude))).ToList();

foreach如下的上面一行代码..

解决方案:我已经"解决"了这个问题,但仍然不知道是什么导致了这个问题.

在与foreach另一个相同的方法中,包含在一个中if.它也有站标识符;

if (zoomChanged)
{
    foreach (var station in fullStationList)
    {
        station.ClusterId = Guid.Empty;
    }
    RunOnUiThread(() => _stationMap.Clear());
    _clusters.Clear();
}
Run Code Online (Sandbox Code Playgroud)

通过更改任一变量名称,代码将正常运行,并且先前错误的循环将运行没有任何问题.

请注意,第二个循环不在第一个循环中 - 这显然不起作用,但我不明白为什么这会导致问题.

ck8*_*4vi 0

我以这种方式尝试过并且有效:

internal class CStation
{
    private Guid _clusterId;

    public CStation()
    {

        _clusterId = Guid.NewGuid(); 
    }

    public Guid StationName
    {
        get { return _clusterId; }
    }
}

private voit TestList()
{

    List<CStation> stationList = new List<CStation>();
    CStation test1 = new CStation();
    CStation test2 = new CStation();
    CStation test3 = new CStation();
    stationList.Add(test1);
    stationList.Add(test2);
    stationList.Add(test3);

    foreach (var station in stationList)
    {

        // Breakpoint on next line shows station to be null..!
        if (station == null )
        {
            throw new  ArgumentNullException();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为您没有实例化 Guid。我在 Station 的构造函数中做到了 ->_clusterId = Guid.NewGuid();

  • 但正如OP提到的“station is null”而不是“station.StationName is null”,除此之外,在“TestList()”上它可能应该是“void”而不是“voit” (2认同)