我有以下代码:
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 while
函数中的RemoveTestClass
循环,而不是迭代遍历每个元素,就像我'我在做什么?
答案 0 :(得分:6)
您可以使用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);
}
答案 1 :(得分:3)
我能想到的最简单的方法是找到符合条件的第一项,然后使用List.Remove来做:
myList.Remove(myList.FirstorDefault(x=>x.StringValue == stringValue))
因为Remove
在找不到项目时没有抛出异常,上面的工作正常。除了你有权在列表中有空值,这将被删除,我认为将它们列入列表并不是那么好。
答案 2 :(得分:2)
我会这样做:
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);
}
}