迭代一个集合并删除我不想要的

时间:2011-01-20 11:24:01

标签: c# .net asp.net-mvc model-view-controller asp.net-3.5

我遇到以下问题。我有一个集合:

Collection<Vehicle> list = new Collection<Vehicle>();

code = 1,2,3, Description = "aaa"
code = 10,438,13, Description = "bbb"
code = 81,8623,362, Description = "ccc"
code = 163,4312,53, Description = "ddd"
...

但我只关心他们中的一些..我关心的清单就在这里,即codesCareAbout =“1 | 2 | 3 | 163 | 4312 | 53”

我需要遍历该集合并删除我不关心的车辆,或者选择另一个包含我关注的车辆的列表?

有什么建议吗?

非常感谢, 詹姆斯

3 个答案:

答案 0 :(得分:4)

您可以向后迭代列表,并使用RemoveAt使用for索引从列表中删除:

for (int i = list.Count - 1; i >= 0; i--)
{
    Foo item = list[i];

    if (IsFoobar(item))
        list.RemoveAt(i);
}

需要向后计数,这样你就不会随意改变你的索引计数,因为你不能改变使用枚举器枚举的列表,所以需要使用for循环。

或者,按照您的建议,按照您的要求填写空列表 - 但是,使用取决于您是否需要修改您给出的列表或者可以创建新列表。

答案 1 :(得分:0)

假设Vehicule有Code(string)属性和Description属性(问题不清楚!)。

1 /克隆列表:var clone = list.ToList();

2 /迭代并决定当前项目是否有趣:

foreach(var item in clone)
{
   if (! IsInteresting(item))
      list.Remove(item);
}

3 / IsInteresting可以是,例如:

foreach(var code in item.Code.Split(','))
{
    if (codesCareAbout.Split('|').Contains(code))
      return true;
}

答案 2 :(得分:0)

使用linq过滤列表会产生最干净的代码:

var interestinglist = list.Where(v=> v.IsInteresting(v));

IsInteresting可以实现为

codesIcareAbout.Intersect(v.Codes).Any();

这假设两个字段都是集合而不是字符串,但可以通过调用string.Split()轻松修复。