我有一个像这样的 2D 数组:
string[,] ClassNames =
{
{"A","Red"},
{"B","Blue"},
{"C","Pink"},
{"D","Green"},
{"X","Black"},
};
我通过 语句在第一列中搜索 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 获取颜色。 如何将上面的语句转换为LINQ。
答案 0 :(得分: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";
或者在查询语法中:
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";
如果你不得不做很多这样的查询,首先生成字典然后查询它会更有效率。
答案 1 :(得分: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[,]
。