如何通过LINQ搜索2D数组?

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

string[,] ClassNames = { {"A","Red"}, {"B","Blue"}, {"C","Pink"}, {"D","Green"}, {"X","Black"}, }; 

我通过for语句在 1列中搜索ClassName ,并在第2列中返回ColorName ,如下所示:

 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语句来获取className颜色 。 如何将上面的语句转换为LINQ。

您可以使用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

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

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

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

如果你不得不做这样的大量查询,首先生成字典然后查询它会更有效率。

这个给你:

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

但说实话, 我绝不会使用LINQ来做到这一点 。 效率较低,可读性较差,维护较差。 您应该考虑使用现有的for循环或更改数据结构,使用ListDictionary而不是string[,]