如何通过 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 语句来获取 className 的 color。 如何将上面的 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<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";
如果你必须做很多这样的查询,首先生成字典然后查询它会更有效率。
【讨论】:
@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<CustomClass>
或 Dictionary<string, string>
而不是 string[,]
。
【讨论】:
当没有元素匹配时你会得到那个错误。我已经用您的示例输入对其进行了测试,并返回了"Red"
。以上是关于如何通过 LINQ 在二维数组中搜索?[version2]的主要内容,如果未能解决你的问题,请参考以下文章