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

时间:2011-10-26 18:54:06

标签: c# linq

我有以下代码:

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循环,而不是迭代遍历每个元素,就像我'我在做什么?

3 个答案:

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