C#从List中删除数据行

时间:2017-11-18 16:43:38

标签: c#

这是我的名单声明:

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的数据?

我需要知道如何删除此列表的整行。

3 个答案:

答案 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) );