方案
我有一个举行比赛的系统,每个种族都有一个独特的成员名单。 (列表是列表< T>)
我希望用户能够从该种族的成员列表中删除成员(如果他们是此成员)。
问题
我正在尝试使用以下代码:
foreach (string item in hillracing.searchRaces(RaceID).RaceList) // Loop through List with foreach.
{
if (item == SelectedItem)
{
item = null;
}
}
我无法编辑变量,因为它在foreach循环中,我将如何实现另一种方式?
答案 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);