Linq:选择列表<字符串>中的位置

本文关键字:位置 字符串 选择 列表 Linq | 更新日期: 2023-09-27 18:33:39

在这里使用一些LinqToExcel过滤...

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

IEnumerable<string> ColumnNames
Cell this[string columnName]

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

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

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

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

Linq:选择列表<字符串>中的位置

这是你要找的吗?

var colnames = new List<string>();
var rows = new Dictionary<string, object>();
var result = rows.Where(kv => colnames.Contains(kv.Key)).Select(kv => kv.Value);

定义一个名为 MyObject 的对象,该对象具有与要选择的 9 列对应的属性名称。

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

宾果游戏。现在,您可以使用 9 列作为属性循环访问 30 个对象。请记住,LinqToExcel 会很乐意填充对象,即使它们没有表示所有列。

您甚至可以将一个名为"row"的属性或方法作为MyObject的一部分,它将是一个Dictionary()对象,因此如果您更喜欢该语法而不是仅说myObject.ColumnName来获取值,则可以说myObject.row["ColumnName"]来引用值。就个人而言,我宁愿处理实际属性,也不愿使用字典卷积。

我最终分两步完成此操作:

        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;
        }