在C#中有条件地迭代自定义列表和从列表中删除项目

时间:2016-06-07 07:56:43

标签: c# list iterator

我想迭代一个自定义列表,即定义为:

for (int i = 0; i < _barcodeCollection.Count; i++)
{
    var response =
        await _serverUrl.PostUrlEncodedAsync(
            new { barcode = _barcodeCollection[i].Text })
            .ReceiveString();

    if (string.Equals(response, "ok", StringComparison.OrdinalIgnoreCase))
    {
        percentage += progressSteps;

        _barcodeCollection.RemoveAt(i); //EXCEPTION!!!

        i--; // index must be checked twice else one element will be skipped

        await UploadProgress.ProgressTo(percentage, 250, Easing.Linear);
    }
}

虽然方法List<CurrentCluster> _curClusters = new List<CurrentCluster>(); IEnumerator<CurrentCluster> _clusIterate = _curClusters.GetEnumerator(); while (_clusIterate.MoveNext()) { // Error_01: Cannot implicitly convert CurrentCluster to Cluster Cluster _curClus = _clusIterate.Current; // Cluster is base class while // CurrentCluster is derived class // Error_02: Does not contain a definition for GetClusterSize() if (_curClus.GetClusterSize() == 0) { // Error_03: Remove(char) has some invalid arguments. _clusIterate.ToString().ToList().Remove(_curClus); } } 在类GetClusterSize()中定义为:

Cluster.cs

如果特定群集的大小在该群集列表中等于零(即public int GetClusterSize() { return _clusterObjects.Count; // _clusterObjects is a defined in this class as: // List<EvoObject> _clusterObjects = new List<EvoObject>(); } ,则从列表中删除该群集。

我们如何迭代自定义列表并有条件地从列表中删除项目?

4 个答案:

答案 0 :(得分:1)

如何使用List RemoveAll方法并执行此操作?

_curClusters.RemoveAll(_curClus=>_curClus.GetClusterSize() == 0);

答案 1 :(得分:1)

你应该可以使用for循环 - 你必须向后工作,否则你会移动元素,有些会被跳过。

for (int n=_curClusters.Count; n>=0; n--) 
{ 
  if (_curClusters[n].GetClusterSize()==0)  
  {  
     _curClusters.RemoveAt(n);  
  }
}

答案 2 :(得分:0)

使用迭代从集合中删除项目既是高级技术,也是过时技术。请改用LINQ:

_curClusters = _curClusters.Where(c => c.GetClusterSize() > 0).ToList();

现在curClusters只包含“大小的群集”,无论这意味着什么。

如果你坚持通过迭代来做到这一点:

问题在于,在迭代其项目时​​,您不得更改集合。相反,您可以迭代并确定是否需要删除某个项目并以某种方式标记它 - 例如,您可以将其添加到另一个仅包含要删除的项目的列表中。在对原始集合进行第一次迭代后,启动第二次并从原始集合中删除项目,如下所示:

var toBeRemoved = new List<CurrentCluster>();

foreach (var suspiciousCluster in _curCluseters)
{
    if(suspiciousCluster.GetClusterSize() == 0)
    {
        toBeRemoved.Add(suspiciousCluster);
    }
}

foreach (var voidCluser in toBeRemoved)
{
    _curCluster.Remove(voidCluster);
}

同样,_curClusters只包含“大小的群集”,无论这意味着什么。

但我强烈推荐第一种方法。

答案 3 :(得分:-1)

我不明白你为什么要这么复杂......只是你可以通过下面的代码实现目标

        List<CurrentCluster> _curClusters = new List<CurrentCluster>();
        _curClusters.RemoveAll(i => i.GetClusterSize()== 0);

        //OR

        for (int i = 0; i < _curClusters.Count; )
        {
            //If you have some more logical checking with CurrentCluster
            //before remove

            if (_curClusters[i].GetClusterSize()== 0)
            {
                _curClusters.Remove(_curClusters[i]);
                continue;
            }

            i++;
        }