C#如何检查多维数组是否有值及其索引?

时间:2016-05-15 00:24:27

标签: c# arrays multidimensional-array

我有一个多维数组:

string[,] array = new string[,]
{
    {"cat", "dog", "plane"},
    {"bird", "fish", "elephant"},
};

我想确定它是否包含一个值,如果是,我需要它的索引,让我们说,#34; bird"。

我需要的是

  • 查找是否包含它。
  • 获取它的索引。
  • 获取第二维的长度(我不知道它是如何调用的)并将第二个元素的随机值返回到该维度的最后一个。

所以,如果我说"鸟"我想让它在" fish"之间给我一个随机的字符串。和" elephant"。 如果它是一个普通的数组,我会做一个简单的

random.Next(1, array.Length);

但是,我不知道如何使用2D阵列制作它。

谢谢!

4 个答案:

答案 0 :(得分:2)

您需要使用array.Length代替array.GetLength来获取多维数组的单个维度的长度。

遍历数组。如果找到匹配项,请使用RandomRandom rnd = new Random(); int index = -1; string randomWord = ""; for(int i = 0; i < array.GetLength(0); i++) { if (array[i,0] == "bird") { index = i; randomWord = array[i,rnd.Next(1, array.GetLength(1))]; break; } } 类来存储当前索引并从匹配行中获取随机值。

{{1}}

答案 1 :(得分:1)

List<list<string>>会更容易使用。

如果我从原始数据开始,我会将其嵌套在列表中:

List<List<string>> nested =
    array
        .OfType<string>()
        .Select((x, i) => new { x, i })
        .GroupBy(x => x.i / array.GetLength(1), x => x.x)
        .Select(x => x.ToList())
        .ToList();

现在我可以写这个函数了:

var random = new Random();
Func<string, string> getRandom = x =>
(
    from row in nested
    where row[0] == x
    from choice in row.Skip(1).OrderBy(y => random.Next())
    select choice
).FirstOrDefault();

使用getRandom("bird")正确调用它可以"fish""elephant"

答案 2 :(得分:1)

以下是使用多维数组执行所需操作的示例。请注意,在评论中,您需要处理一个边缘情况。

using System;

class Program
{
    static string[,] array = new string[,]
    {
        { "cat", "dog", "plane" },
        { "bird", "fish", "elephant" },
    };

    static int FindRow(string elem)
    {
        int rowCount = array.GetLength(0),
            colCount = array.GetLength(1);
        for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
        {
            for (int colIndex = 0; colIndex < colCount; colIndex++)
            {
                if (array[rowIndex, colIndex] == elem)
                {
                    return rowIndex;
                }
            }
        }
        return -1;
    }

    static string PickRandomTail(int rowIndex)
    {
        int colCount = array.GetLength(1);
        int randColIndex = new Random().Next(1, colCount);
        return array[rowIndex, randColIndex];
    }

    static void Main()
    {
        int rowIndex = FindRow("bird");
        if (rowIndex < 0)
        {
            // handle the element is not found
        }
        Console.WriteLine(PickRandomTail(rowIndex));
    }
}

答案 3 :(得分:-1)

这是一个不破坏数据结构的示例:

static int IndexOf<T>(T[,] array, T toFind)
    {
        int i = -1;
        foreach (T item in array)
        {
            ++i;
            if (toFind.Equals(item))
                break ;
        }
        return i;
    }

    static string GetRandomString(string[,] array, string toFind)
    {
        int lineLengh = array.Length / array.Rank;
        int index = IndexOf(array, toFind);
        int lineIndex = index / lineLengh;

        Random random = new Random();
        index = random.Next(lineIndex * lineLengh + 1, (lineIndex + 1) * lineLengh);
        return array[lineIndex, index % lineLengh];
    }

    // If you want to get a random element between the index and the end of the line
    // You can replace "bird" by any word you want,
    // except a word at the end of a line (it will return you the first element of the next line)
    // static string GetRandomString(string[,] array, string toFind)
    // {
    //     int lineLengh = array.Length / array.Rank;
    //     int index = IndexOf(array, toFind);

    //     Random random = new Random();
    //     index = random.Next(index + 1, (index / lineLengh + 1) * lineLengh);
    //     return array[index / lineLengh, index % lineLengh];
    // }

    static void Main(string[] args)
    {
        string[,] array = new string[,]
        {
            {"cat", "dog", "plane"},
            {"bird", "fish", "elephant"},
        };
        Console.WriteLine(GetRandomString(array, "bird"));
        Console.ReadKey();
    }

为了完美,你应该添加一个检查,如果索引不是-1,你是否可以从索引和行尾之间的范围得到一个随机数。

如果您的multidimensionnal数组可以包含不同大小的行,您还应该使用string [] []。使用字符串[,],您的数组必须包含相同大小的行。