【问题标题】:Linq: select where in List<string>Linq:选择 List<string> 中的位置
【发布时间】:2013-10-02 14:07:52
【问题描述】:

在这里进行一些 LinqToExcel 过滤...

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

IEnumerable<string> ColumnNames
Cell this[string columnName]

所以:List&lt;Row&gt; 有 30 行,每行有 12 个列名。现在我想使用List&lt;string&gt; columnsToFilter 过滤List&lt;Row&gt;,这样我最终得到一个有30 行和9 ColumnNames 的List&lt;Row&gt;

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

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

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

【问题讨论】:

  • 有点不确定你在问什么。您问的是如何“过滤”,但是当您谈论Select 时,您使用“过滤器”,这通常被认为是“投影”而不是“过滤器”。 “过滤器”通常是像 WhereCountFirstSingle 这样的函数来进行过滤。
  • 你说得对,我的意思是选择,我更新了问题。我可以使用字符串选择一列的数据,但我想使用字符串列表选择多列的数据
  • 从这里stackoverflow.com/questions/6772267/… 看起来你可以使用||
  • 是的,但是您必须知道“列表”中有多少项目,而且这也可能会有所不同...
  • 我想你想说的是你想建立一个基于列表内容的动态选择语句。我会查看这个问题:stackoverflow.com/questions/606104/… 以获取有关如何执行此操作的提示。

标签: c# asp.net-mvc linq linq-to-excel


【解决方案1】:

这是你要找的吗?

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

【讨论】:

  • 这或多或少是我想去的方向,但在我的情况下,rows 不是字典,而是 IEnumerable,其中 Row 具有上述属性。所以, colnames.Contains(kv.Key) 不起作用。在我的例子中,它是 colnames.Contains(kv.ColumnNames),其中 ColumnNames 是一个 IEnumerable。我要做的就是使用 IEnumerable 对象上的 IEnumerable ColumnNames 属性来仅选择与 colnames List 匹配的行
【解决方案2】:

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

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

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

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

【讨论】:

  • 我不知道您可以将对象映射到 excel 文件的选择,谢谢!不幸的是,excel.GetColumnNames("sheettitle") 对我没有用(主要将 F10、F12 等呈现为列名)。因此,如果有办法将 myObject.row 映射到列索引或其他东西,那就太好了。
【解决方案3】:

我最终分两步完成:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2013-05-28
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多