簡體   English   中英

如何通過 LINQ 在二維數組中搜索?[version2]

[英]How to search in 2D array by LINQ ?[version2]

我有一個像這樣的二維數組:

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

說法搜索類名1ND列通過在這樣的第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獲取顏色 如何將上面的 for 語句轉換為 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<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"; 

如果你必須做很多這樣的查詢,首先生成字典然后查詢它會更有效率。

給你:

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[,]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM