0

在这里与一些 LinqToExcel 过滤作斗争......

我有一个List<string> columnsToFilter包含 9 个字符串的 a,我想过滤掉 a 中某些列的数据List<Row>,其中Row包含属性

IEnumerable<string> ColumnNames
Cell this[string columnName]

所以:List<Row>有 30 行,每行有 12 个列名。现在我想过滤它,List<Row>以便List<string> columnsToFilter我最终List<Row>得到 30 行和9个列名。

我可以通过查询列名来选择列的数据:

var result = content.Select(m => m["Column1"]).ToList();

现在我想根据字符串列表List<string> columnsToFilter过滤数据。实现这一目标的最佳方法是什么?

4

3 回答 3

4

这是你想要的?

var colnames = new List<string>();
var rows = new Dictionary<string, object>();
var result = rows.Where(kv => colnames.Contains(kv.Key)).Select(kv => kv.Value);
于 2013-10-02T16:34:31.867 回答
1

定义一个名为 MyObject 的对象,其属性名称对应于您要选择的 9 列。

var excel = new ExcelQueryFactory("excelFileName");
var myObjects = from c in excel.Worksheet<MyObject>()
                       select c;

答对了。您现在可以使用 9 列作为属性来遍历 30 个对象。请记住,即使对象没有表示所有列,LinqToExcel 也会愉快地填充对象。

你甚至可以有一个属性或方法作为 MyObject 的一部分,称为“row”,它是一个 Dictionary() 对象,所以如果你更喜欢这种语法而不是只说 myObject,你可以说 myObject.row["ColumnName"] 来引用一个值。 ColumnName 来获取值。就个人而言,我宁愿处理实际属性也不愿使用字典卷积。

于 2013-10-08T16:36:42.990 回答
0

我最终分两步执行此操作:

        foreach (var column in columnNumbers)
        {
            yield return data.Select(m => m[column].Value.ToString()).ToList();
        }

现在我有了我需要的数据,但是交换了行和列,所以我不得不将行交换为列,反之亦然:

        for (int i = 1; i < rowCount; i++)
        {
            var newRow = new List<string>();

            foreach (var cell in list)
            {
                newRow.Add(cell[i]);
            }

            yield return newRow;
        }
于 2013-10-04T07:23:13.187 回答