如何在foreach循环中编辑迭代器

时间:2015-05-19 10:46:24

标签: c# loops foreach

方案

我有一个举行比赛的系统,每个种族都有一个独特的成员名单。 (列表是列表< T>)

我希望用户能够从该种族的成员列表中删除成员(如果他们是此成员)。

问题

我正在尝试使用以下代码:

foreach (string item in hillracing.searchRaces(RaceID).RaceList) // Loop through List with foreach.
{
    if (item == SelectedItem)
    {
        item = null;
    }
}

我无法编辑变量,因为它在foreach循环中,我将如何实现另一种方式?

5 个答案:

答案 0 :(得分:0)

您无法在foreach循环中执行此操作。如果IList / IList<T>允许随机访问,例如数组或列表,则可以使用for - 循环:

List<string> = hillracing.searchRaces(RaceID).RaceList;
for(int i = 0; i < list.Count; i++)
{
    if(list[i] == SelectedItem)
         list[i] = null;
}

所以you can't add or remove items in the foreach但你也无法取代引用。对象引用原始值,因此您可以修改对象(如果字符串不是不可变的),但您不能在foreach中替换引用本身。 This是相关的。

答案 1 :(得分:0)

您无法使用foreach循环修改正在循环的集合。 foreach中使用的集合是不可变的。这是设计的。

  

foreach语句用于迭代集合以获取   您想要的信息,但不能用于添加或删除   来自源集合的项目,以避免不可预测的副作用。   如果需要在源集合中添加或删除项目,请使用   for loop

答案 2 :(得分:0)

您可以存储它,然后将其从集合中删除。

var toRemove = null;
foreach (string item in hillracing.searchRaces(RaceID).RaceList) // Loop through List with foreach.
{
    if (item == SelectedItem)
    {
        toRemove = item;
        break; //Can break here if you're sure there's only one SelectedItem
    }
}
hillracing.searchRaces(RaceID).Racelist.Remove(toRemove);

虽然在这种情况下你也可以使用hillracing.searchRaces(RaceID).Racelist.Remove(SelectedItem);,但你根本不会使用foreach循环。

答案 3 :(得分:0)

使用现有的Remove() - 方法为您搜索和删除该项目:

hillracing.searchRaces(RaceID).RaceList.Remove(SelectedItem);

答案 4 :(得分:-1)

使用Linq,您不需要循环查找要取消的条目...

// Use of Single() here assumes the object definitely exists. 
// Use SingleOrDefaul() if there is a chance it might not exist.
var item = hillracing.searchRaces(RaceID)
                     .RaceList
                     .Where(x => x.Item == SelectedItem).Single();  

item = null;

修改:由于您已更改了从列表中删除项目的要求,因此我认为您只需使用找到的项目调用Remove方法`。所以代码变成了

// Use of Single() here assumes the object definitely exists. 
// Use SingleOrDefaul() if there is a chance it might not exist.
var item = hillracing.searchRaces(RaceID)
                     .RaceList
                     .Where(x => x.Item == SelectedItem).Single();  

hillracing.searchRaces(RaceID).RaceList.Remove(item);