简化在列表中定位元素,可能使用LINQ

本文关键字:LINQ 元素 列表 定位 | 更新日期: 2023-09-27 18:12:41

我有以下代码:

class TestClass
{
    public string StringValue {
        get; set;
    }
    public int IntValue {
        get; set;
    }
}
class MainClass
{
    private readonly List<TestClass> MyList;
    public MainClass()
    {
        MyList = new List<TestClass>();
    }
    public void RemoveTestClass(string strValue)
    {
         int ndx = 0;
         while (ndx < MyList.Count)
         {
             if (MyList[ndx].StringValue.Equals(strValue))
                 break;
             ndx++;
         }
         MyList.RemoveAt(ndx);
    }
    public void RemoveTestClass(int intValue)
    {
         int ndx = 0;
         while (ndx < MyList.Count)
         {
             if (MyList[ndx].IntValue == intValue)
                 break;
             ndx++;
         }
         MyList.RemoveAt(ndx);
    }
}

我想知道的是,是否有一种更简单的方法,也许使用LINQ,来替换2 RemoveTestClass函数中的while循环,而不是像我这样迭代每个元素?

简化在列表中定位元素,可能使用LINQ

您可以使用List<T>.FindIndex:

myList.RemoveAt(MyList.FindIndex(x => x.StringValue == strValue));

您可能还想处理未找到元素的情况:

int i = myList.FindIndex(x => x.StringValue == strValue);
if (i != -1)
{
    myList.RemoveAt(i);
}

我能想到的最简单的方法是找到第一个符合条件的项目,然后使用List。Remove to do:

myList.Remove(myList.FirstorDefault(x=>x.StringValue == stringValue)) 

因为Remove在找不到项目时不会抛出异常,上面的工作很好。除了你允许在list中有空值,它将被删除,我认为在list中有空值是不太好的

我会这样做:

public void RemoveTestClass(string strValue) 
{ 
     MyList.RemoveAll(item => item.StringValue.Equals(strValue));
} 

:

public void RemoveTestClass(int intValue) 
{ 
     MyList.RemoveAll(item => item.IntValue == intValue);
} 
更新:

如果你只想删除第一个字符:

public void RemoveTestClass(int intValue) 
{ 
     var itemToRemove = MyList.FirstOrDefault(item => item.InValue == intValue);
     if (itemToRemove != null)
     {
         MyList.Remove(itemToRemove);
     }
}