如何使用lambda表达式删除包含0的列

时间:2011-06-20 11:06:02

标签: c# asp.net

我有一个列表,其中包含假设4列我想要删除从第一行到最后一行包含0的列。在这种情况下,我想删除第二&第4列我如何使用lambda表达式c#4.0

来实现这一点
c1  c2  c3  c4
1   0   10  0
2   0   20  0
3   0   30  0

o / p应该是

c1  c2
1   10
2   20
3   30

3 个答案:

答案 0 :(得分:1)

您无法从对象中删除属性。您应该将数据转换为实际可以删除列的内容,例如列表列表:

List<List<int>> list = originalList.Select(
  i => new List<int>(){ i.c1, i.c2, i.c3, i.c4 }
).ToList();

现在,您可以检查列表中的数据并删除列:

int i=0;
while (i < list[0].Count) {
  if (!list.Any(x => x[i] != 0)) {
    foreach (List<int> item in list) {
      item.RemoveAt(i);
    }
  } else {
    i++;
  }
}

另一种方法是对角镜像列表,即将其转换为包含每个项目数据的列列表,而不是包含列的项目列表。这样可以更容易删除列,但其他一些操作会更难,例如对项目进行排序。

答案 1 :(得分:0)

在LINQ查询的where子句中使用'SUM'。它可能类似于C2列的总和大于零的情况。 This SO question可能对您有所帮助。

答案 2 :(得分:0)

假设您将列表实现为嵌套列表,您可以执行以下操作:

List<List<int>> lists = new List<List<int>>();

// fill data here
// ...
// ...

List<List<int>> filtered = lists.Where(lst => lst.Any(num => num != 0)).ToList();

如果您需要的是仅包含满足条件的属性的对象,则应使用反射(或者可能是.NET 4.0中的Dynamic对象)。在那种情况下,我不会强迫用lambdas做。

尝试更详细地解释您的数据结构,以便有人提供有用的答案。