我想迭代一个自定义列表,即定义为:
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>();
}
,则从列表中删除该群集。
我们如何迭代自定义列表并有条件地从列表中删除项目?
答案 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++;
}