11

我有一个像这样的二维数组:

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

我通过for语句在第一列中搜索ClassName第二列中返回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获取颜色。如何将上面的 for 语句转换为 LINQ。

4

2 回答 2

13

您可以使用该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<string, string>第一个:

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

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

于 2013-09-07T13:33:51.363 回答
3

给你:

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<CustomClass>Dictionary<string, string>代替string[,].

于 2013-09-07T13:37:38.130 回答