【问题标题】:Searching a two dimensional object array in c#在 C# 中搜索二维对象数组
【发布时间】:2021-04-01 14:12:19
【问题描述】:

我已将二维对象数组声明为

object[,] sectionOpenings = new object[20, 4]; 

第一列是字符串类型,其余三列都是整数。

我希望快速搜索以在第一列中找到具有匹配字符串的行并尝试过

var first = Array.Find(sectionOpenings, p => p == "homedepot");

我收到以下错误:

错误 CS0411 无法从用法中推断方法“Array.Find(T[], Predicate)”的类型参数。尝试明确指定类型参数。

有什么建议吗?

【问题讨论】:

  • Array.Find 仅适用于一维数组
  • 不要使用不同类型的二维数组,而是使用特定类型的对象的单维数组(比如具有字符串属性和三个整数属性的类)。您收到错误的原因是您的数组中的对象类型只是object。您的谓词(lambda p => p == "homedepot")不知道该怎么做,因为p 是一个对象并且它没有operator == (string)。至少(如果您想留在值类型领域),请使用 List<(string, int, int, int)> 或类似的元组数组。
  • 谢谢@greenjaed。

标签: c# arrays


【解决方案1】:

我建议更改为字典以确保类型安全 - 如下所示:

var sectionOpenings = new Dictionary<string, List<int>>();
sectionOpenings.TryGetValue("homedepot", out var result);

但是,如果您无法使用2D array,您可能需要分两步完成此操作。一,您必须找到匹配的列。第二,您必须检索该列。像这样的东西可以工作:

object[,] sectionOpenings = new object[20, 4];

var firstRowMatch = Enumerable
     .Range(0, sectionOpenings.GetLength(0)) // Gets row indices
     .Where(row => sectionOpenings[row, 0].ToString().Equals("homedepot"))
     .First();

var result = Enumerable
     .Range(0, sectionOpenings.GetLength(1)) // Gets column indices
     .Select(column => sectionOpenings[firstRowMatch, column])
     .ToArray();

在此示例中,您可能需要添加一些类型检查和空值检查,以确保不会引发 NullReferenceException。

这是改编自 returning a whole column from a 2D arraygetting the number of columns/rows from a 2D array 堆栈溢出。

PS。这假设您使用的是System.Linq

【讨论】:

  • 我将对象数组更改为 Dictionary @Ziv。这是最简单最快的
【解决方案2】:

你可以稍微修改你的代码来得到你想要的东西:

var first = Array.Find(sectionOpenings, p => p[0] == "homedepot");

这将在每个数组行中查找第一列 p[0] == "homedepot"

编辑: 我的错,我想到了锯齿状数组

嗯,它不是一个单行,但你可以创建一个像这样的方法:

public static int GetMatchingRow(object[,] myArr, string findMe)
{
    for (int i = 0; i < myArr.GetLength(0); i++)
    {
        if (myArr[i, 0] is string && myArr[i, 0] as string == findMe)
            return i;
    }

    return -1;
}

【讨论】:

  • 这不会编译并返回与 OP 相同的错误。
猜你喜欢
  • 2014-06-26
  • 2014-06-04
  • 2015-04-22
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多