简化在列表中定位元素,可能使用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
循环,而不是像我这样迭代每个元素?
您可以使用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);
}
}