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

Sam*_*hdi 10 c# linq asp.net arrays multidimensional-array

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

string[,] ClassNames =
{
  {"A","Red"},
  {"B","Blue"},
  {"C","Pink"},
  {"D","Green"},
  {"X","Black"},
};
Run Code Online (Sandbox Code Playgroud)

我通过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;
   }
}
Run Code Online (Sandbox Code Playgroud)

我想使用LINQ,而不是用于声明,以获得颜色类名.如何将上面的语句转换为LINQ.

p.s*_*w.g 12

您可以使用该Enumerable.Range方法生成一个整数序列,然后使用Linq查询它.

像这样的东西会起作用:

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

或者在查询语法中:

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

或者将数组转换为Dictionary<string, string>第一个:

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

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

color = ClassNamesDict.ContainsKey(className) 
      ? ClassNamesDict[className] 
      : "Black"; 
Run Code Online (Sandbox Code Playgroud)

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