C# LINQ 从字符串数组列表中选择

Posted

技术标签:

【中文标题】C# LINQ 从字符串数组列表中选择【英文标题】:C# LINQ select from list of arrays of strings 【发布时间】:2022-01-18 19:51:00 【问题描述】:

我有这个数据

保留在字符串数组列表中:List<string[]> arrData = new List<string[]>();。 列表中填充了以下代码:

int columnsCount =4;
int rowsCount = 6;
for (int j = 0; j < columnsCount; j++)

    string[] columnData = new string[rowsCount];
    for (int i = 0; i < rowsCount; i++)
        columnData[i] = csv[i][j];
    arrData.Add(columnData);

csv[i][j] 给出 r1c1 等的值,所以最后列表有 4 个数组元素,每个数组有 6 个值。

    如何使用 LINQ 选择黄色行,即第一个数组中有“a”,第二个数组中有“g”,第三个数组中有“m”? 如何使用 LINQ 按一列中的值列表进行过滤(即选择第一列中包含“a”或“b”的所有行)?

我可以更改代码并创建列表/字典/任何更合适的列表。

【问题讨论】:

如果没有 LINQ,你会怎么做?您是否尝试过任何方法来实现这一目标? 您自己做的很困难,因为您将数据存储在列中,而不是行中。将其存储为行使其更容易。所以尝试交换外循环和内循环 【参考方案1】:

如何使用 LINQ 选择黄色行,这意味着其中有“a” 第一个数组,第二个是“g”,第三个是“m”?

IEnumerable<string[]> result = arrData
    .Where(arr => arr?.Length > 2 && arr[0] == "a" && arr[1] == "g" && arr[2] == "m");

如何使用 LINQ 按一列中的值列表进行过滤 (意思是选择第一列中带有“a”或“b”的所有行)?

string[] firstColSearch =  "a", "b" ;
IEnumerable<string[]> result = arrData
  .Where(arr => arr?.Length > 0 && firstColSearch.Contains(arr[0]));

【讨论】:

您是否注意到它被存储为列? (不是行) @JeroenvanLangen:我不这么认为。我认为 OP 正在逐行读取 CSV,逐值读取并将它们存储在字符串数组中 将它们存储为行会更容易,因此您可以选择所有符合条件的行。 @JeroenvanLangen:但每个string[] 代表一行并包含所有值 Tim Schmelter 的解决方案在我按照 Jeroen van Langen 的建议将列表填充代码从列切换到行之后起作用。

以上是关于C# LINQ 从字符串数组列表中选择的主要内容,如果未能解决你的问题,请参考以下文章

C# LINQ 从数组/列表中不包含值的位置选择

用于检查字符串列表/数组中的字符串的 C# 最佳实践 (LINQ) [关闭]

Linq 接口列表,接口有成员字符串数组,我想要 linq 语句聚合对象数组中的所有字符串

如何从列表数组(linq 列表)C# 中的所有元素调用方法

在c#/LINQ中将数组转换为字符串的最短方法[重复]

在 C# 中使用 LINQ 在字符串数组中查找确切的子字符串