【问题标题】:string[*,*] does not contain a definition for 'Contains'string[*,*] 不包含“包含”的定义
【发布时间】:2017-09-30 00:47:54
【问题描述】:

我有一个函数可以使用.Contains 检查二维字符串数组是否包含特定字符串值。正在使用System.Linq,这似乎是类似问题中的问题,但是我仍然收到以下错误:

'string[,]' 不包含 'Contains' 的定义,并且 最佳扩展方法重载 'Queryable.Contains(IQueryable,string)' 需要一个 'IQueryable' 类型的接收器。

无论我将比较值更改为什么,此错误都会持续存在。错误发生的上下文为

string comparisonString = " "; 
bool victoryRequirement = mineArray.Contains(comparisonString);

我希望有人能告诉我为什么会发生这个错误以及我是否能够为此目的使用Contains。我怀疑二维数组有部分问题,但我没有那么有经验。

【问题讨论】:

  • 二维数组与数组数组不同。 LINQ 用于一维数组。
  • 是否有解决方法或类似方法来比较二维数组的所有值,因为我必须使用二维数组来实现我的目的
  • 尝试编写自己的扩展方法。大多数 LINQ 查询方法(包括Contains)都是扩展方法。

标签: c# linq


【解决方案1】:

虽然 Adil Mammodov 的答案似乎有效,但它不是很笼统。我宁愿把它写成更短更灵活:

public static IEnumerable<T> ToSequence<T>(this T[,] items)
{
  return items.Cast<T>();
}

现在您可以简单地使用ToSequence 将数组转换为序列,然后对其应用序列运算符。

myItems.ToSequence().Contains(target);

此外,当我们查看您的代码时:尝试根据它们的功能命名事物,而不是它们的类型。如果您在事物名称中包含“Array”和“String”,它们可能具有更好、更具描述性的名称。该类型已在类型中注解。

【讨论】:

  • 可以通过实现泛型来概括我的方法,但这更好,值得被接受。
【解决方案2】:

您可以为二维字符串数组编写自己的包含方法,如下所示:

public bool TwoDimensionalContains(string[,] inputArray, string comparisonString)
{            
    for (int i = 0; i < inputArray.GetLength(0); i++)
    {
        for (int j = 0; j < inputArray.GetLength(1); j++)
        {                    
            // If matching element found, return true
            if (comparisonString.Equals(inputArray[i, j]))
                return true;
        }
    }
    // No matchincg element found, return false
    return false;
}

然后按如下方式使用:

string[,] myArray = new string[2, 2]
{
    { "One", "Two" },
    {  "Three", "Four" }
};

bool contains = TwoDimensionalContains(myArray, "Three");

你也可以将TwoDimensionalContains方法、扩展方法作为其他Linq方法使用。

【讨论】:

    【解决方案3】:

    其实这行得通:

    var c=myArray.Cast<string>().Select(x=>x).Contains("Three");
    

    更简单:

    var c=myArray.Cast<string>().Contains("Three");
    

    【讨论】:

    • 这类似于@EricLipert 的回答,Select 在这里是多余的
    • 哈 - 是的。我是从迂回的方式来的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多