如何通过 LINQ 在二维数组中搜索?[version2]

Posted

技术标签:

【中文标题】如何通过 LINQ 在二维数组中搜索?[version2]【英文标题】:How to search in 2D array by LINQ ?[version2] 【发布时间】:2013-09-11 12:01:40 【问题描述】:

我有一个像这样的 2D 数组:

string[,] ClassNames =

  "A","Red",
  "B","Blue",
  "C","Pink",
  "D","Green",
  "X","Black",
;

我通过 for 语句在 1nd 列中搜索 ClassName 并在 2nd 中返回 ColorName strong> 像这样的列:

string className = "A";
string color = "Black";
for (int i = 0; i <= ClassNames.GetUpperBound(0); i++)

   if (ClassNames[i, 0] == className)
   
      color = ClassNames[i, 1];
      Response.Write(color);
      break;
   

我想使用 LINQ 而不是 for 语句来获取 classNamecolor。 如何将上面的 for 语句转换为 LINQ。

【问题讨论】:

您的二维数组看起来应该是字典? 二维数组实际上是c的东西,在c#中我们应该使用其他集合结构/类。 【参考方案1】:

您可以使用Enumerable.Range 方法生成整数序列,然后使用Linq 对其进行查询。

这样的事情会起作用:

string color = Enumerable
    .Range(0, ClassNames.GetLength(0))
    .Where(i => ClassNames[i, 0] == className)
    .Select(i => ClassNames[i, 1])
    .FirstOrDefault() ?? "Black"; 

或者在查询语法中:

string color = 
    (from i in Enumerable.Range(0, ClassNames.GetLength(0))
     where ClassNames[i, 0] == className
     select ClassNames[i, 1])
    .FirstOrDefault() ?? "Black"; 

或者先将数组转换为Dictionary&lt;string, string&gt;

Dictionary<string, string> ClassNamesDict = Enumerable
    .Range(0, ClassNames.GetLength(0))
    .ToDictionary(i => ClassNames[i, 0], i => ClassNames[i, 1]);

然后您可以更轻松地查询它:

color = ClassNamesDict.ContainsKey(className) 
      ? ClassNamesDict[className] 
      : "Black"; 

如果你必须做很多这样的查询,首先生成字典然后查询它会更有效率。

【讨论】:

@SamieyMehdi 那是null coalescing operator。它基本上意味着'如果左侧的值为空,则使用右侧的值'。请注意,这仅适用于引用或可为空的类型。如果您的实际数组是 int[,],则必须在 select 子句中将结果转换为 (int?) 才能使其正常工作。【参考方案2】:

你在这里:

color = ClassNames.Cast<string>()
                  .Select((x, i) => new  x, i )
                  .GroupBy(x => x.i / 2, (k,x) => x.Select(y => y.x))
                  .Where(g => g.First() == className)
                  .Select(x => x.Last()).First();

但老实说,我永远不会使用 LINQ 来做到这一点。它的效率较低,可读性较差,维护起来也更糟。您应该考虑使用现有的 for 循环或将数据结构更改为 List&lt;CustomClass&gt;Dictionary&lt;string, string&gt; 而不是 string[,]

【讨论】:

当没有元素匹配时你会得到那个错误。我已经用您的示例输入对其进行了测试,并返回了"Red"

以上是关于如何通过 LINQ 在二维数组中搜索?[version2]的主要内容,如果未能解决你的问题,请参考以下文章

如何在二维数组中搜索单词和替换

如何在多维数组上使用 LINQ 来“展开”数组?

如何在从左到右和从上到下排序的二维数组中搜索数字?

在二维数组中搜索 tableView objC

使用 LINQ 在字节数组中搜索以特定字节开始/停止的所有子数组

跨多个单元格最有效地搜索二维数字数组