我有一个对象列表,我试图通过首先检查对象中的属性来删除列表中的特定对象。
最初我使用了foreach
,但后来意识到你在修改集合时不能使用它,所以我决定使用普通的for
,但后来我不知道如何编写代码做我最初写的。
如何编写代码来完成我原来的工作?
由于
这是我的代码:
public void DeleteChunk(int ChunkID)
{
//foreach (Chunk i in ChunkList)
//{
// if (i.UniqueID == ChunkID)
// {
// ChunkList.Remove(i);
// }
//}
//This won't work because here i is just an integer so i.UniqueID won't exist.
for (int i = 0; i < ChunkList.Capacity; i++)
{
if (i.UniqueID == ChunkID)
{
ChunkList.Remove(i);
}
}
}
答案 0 :(得分:60)
您可以使用linq简化此操作:
var item = ChunkList.SingleOrDefault(x => x.UniqueId == ChunkID);
if (item != null)
ChunkList.Remove(item);
您还可以执行以下操作,如果有多个匹配项也可以使用:
ChunkList.RemoveAll(x => x.UniqueId == ChunkID);
答案 1 :(得分:17)
你正在移除然后递增,这意味着你将领先于自己。相反,反向删除,这样你就不会弄乱你的下一个项目。
for (int i = ChunkList.Count-1; i >=0; i--)
{
if (ChunkList[i].UniqueID == ChunkID)
{
ChunkList.RemoveAt(i);
}
}
答案 2 :(得分:7)
如果ChunkList
为List<Chunk>
,您可以使用RemoveAll
方法:
ChunkList.RemoveAll(chunk => chunk.UniqueID == ChunkID);
答案 3 :(得分:3)
最初我使用了foreach但后来意识到你在修改集合时不能使用它
您可以创建该集合的副本,并使用ToList()
进行迭代以创建要复制:
foreach(Chunk chunk in ChunkList.ToList())
{
if (chunk.UniqueID == ChunkID)
{
ChunkList.Remove(chunk);
}
}
答案 4 :(得分:2)
此代码存在两个问题:
答案 5 :(得分:2)
您正在检查i
的{{1}},而UniqueID
实际上是一个整数。如果你想继续i
循环,你应该做那样的事情。
for
然而,您可以并且应该使用linq:
for (int i = 0; i < ChunkList.Capacity; i++)
{
if (ChunkList[i].UniqueID == ChunkID)
{
ChunkList.Remove(i);
}
}
答案 6 :(得分:1)
一种方法是创建要修改的集合的副本,根据需要更改副本,然后用最后的副本替换原始集合。
答案 7 :(得分:1)
您可以使用while循环删除与ChunkID匹配的项目/项目。这是我的建议:
public void DeleteChunk(int ChunkID)
{
int i = 0;
while (i < ChunkList.Count)
{
Chunk currentChunk = ChunkList[i];
if (currentChunk.UniqueID == ChunkID) {
ChunkList.RemoveAt(i);
}
else {
i++;
}
}
}
答案 8 :(得分:1)
首先,您必须在列表中找到对象。然后,您可以从列表中删除。
var item = myList.Find(x=>x.ItemName == obj.ItemName);
myList.Remove(item);
答案 9 :(得分:0)
首先,您使用Capacity
代替Count
。
其次,如果只需要删除一个项,那么您可以愉快地使用循环。您只需要确保在删除项目后突破循环,如下所示:
int target = 4;
for (int i = 0; i < list.Count; ++i)
{
if (list[i].UniqueID == target)
{
list.RemoveAt(i);
break;
}
}
如果您要从列表中删除与ID匹配的所有项,则会变得更加容易,因为您可以使用List<T>.RemoveAll(Predicate<T> match)
int target = 4;
list.RemoveAll(element => element.UniqueID == target);
答案 10 :(得分:0)
最简单的解决方案,不使用LINQ:
Chunk toRemove = null;
foreach (Chunk i in ChunkList)
{
if (i.UniqueID == ChunkID)
{
toRemove = i;
break;
}
}
if (toRemove != null) {
ChunkList.Remove(toRemove);
}
(如果Chunk是一个结构体,那么你可以使用Nullable&lt; Chunk&gt;来实现这一点。)