这是我的名单声明:
public List<CharactersOnline> charactersOnline = new List<CharactersOnline>();
public class CharactersOnline
{
public int connectionId;
public int characterId;
public string characterName;
}
以下是我在此列表中添加行的方法:
charactersOnline.Add(new CharactersOnline() { connectionId = cnnId, characterId = charId, characterName = name });
以下是我认为我可以通过选择其中一个参数来删除一行:
private void CharacterLogout(int charId)
{
charactersOnline.Remove(new CharactersOnline() { characterId = charId });
}
我是否可以仅仅指向其中一个参数来删除列表行中的所有数据,或者这只是删除characterId
的数据?
我需要知道如何删除此列表的整行。
答案 0 :(得分:1)
一种方法是找到它然后将其删除:
var charactersOnline = new List<CharactersOnline>();
var target = charactersOnline.SingleOrDefault(x => x.characterId == 1);
charactersOnline.Remove(target);
所以你的方法将是这样的:
private void CharacterLogout(int charId)
{
var target = charactersOnline.SingleOrDefault(x => x.characterId == charId);
charactersOnline.Remove(target);
}
答案 1 :(得分:1)
更具功能性的另一种方法。
private void CharacterLogout(int charId)
{
charactersOnline = charactersOnline.Where(line => line.characterId != charId)
.ToList();
}
请注意,上述方法将删除具有给定charId
值的所有行。
您的方法无效,因为Remove
方法将搜索与要删除的给定项目具有相同引用的元素
第new CharactersOnline() { characterId = charId }
行将创建对象的新实例,该引用不存在于列表中
因此,要删除正确的项目,您应该先找到它。
var indexesToRemove =
charactersOnline.Select((line, index) => (Id: line.characterId, Index: index))
.Where(item => item.Id == charId)
.Select(item => item.Index);
foreach (var index in indexesToRemove)
{
charactersOnline.RemoveAt(index);
}
答案 2 :(得分:0)
使用此代码根据条件
从列表中删除项目charactersOnline.Remove(charactersOnline.Single(s => s.characterId = charId) );