2

我有一系列颜色。

Black[0]
White[1]
Blue[2]
Green[3]
Red[4]
Purple[5]
Orange[6]
Pink[7]
Silver[8]

有一个 for 循环迭代颜色数组的计数并与传入的字符串进行比较。在这种情况下,它是字符串中的单一颜色。

private ushort? FindColor(SomeObject colorArray, string name)
{
    for (ushort i = 0; i < colorArray.Count; ++i)
    {
        SomeObject someObject = colorArray[i];
        try
        {
            if (someObject.Name == name)
                return i;
        }
    }
    return null;
}

如果字符串名称与 [i] 处的颜色匹配,则返回找到的数组编号。

需要发生的是名称将是一个逗号分隔的颜色字符串。所以它可能是Red,Purple

我想做的是通过 colorArray 并找出每个拆分字符串颜色是否在彼此相邻的数组中找到。所以在这种情况下,红色出现在 4 处,紫色出现在 5 处。因为它们彼此相邻,所以我想返回 4。否则,如果没有在彼此旁边找到 2 种颜色,则返回 null。

private List<string> GetColors(string colorName)
{
    if (colorName == null)
        return new List<string>();

    string[] parts = colorName.Split(',');
    return parts.Select(p => p.Trim()).ToList();
}

private ushort? FindColor(SomeObject colorArray, string name)
{
    var colors = GetColors(name);

    for (ushort i = 0; i < colorArray.Count; ++i)
    {
        SomeObject someObject = colorArray[i];
        try
        {
            ????
            for(int j = 0; j < colors.Count; j++)
            {

                if (someObject.Name == colors[j])
                {
                    // found the first color of Red at [4]
                    // store in a temp variable ????

                    // back into the loop and found Purple at [5]
                    // Purple at [5] was found to be beside Red at [4] so return [4]

                    return i; // i in this case would be 4

                    // if the colors are not found beside each other then
                    return null;
                }
            }
        }
    }
    return null;
}

谁能推荐检查这种情况的最佳方法?

4

2 回答 2

1

我认为这可能对你有用

    private void GetColors(string colors)
    {
        string[] colorArray = new string[] { "red", "green", "purple" };

        int previousIndex = -1;
        int currentIndex;

        string[] myColors = colors.Split(',');
        foreach (string s in myColors)
        {
            currentIndex = Array.IndexOf(colorArray, s);
            if (previousIndex != -1)
            {
                if (previousIndex - currentIndex == 1 || previousIndex - currentIndex == -1)
                {
                    //do stuff here
                }
            }


            previousIndex = currentIndex;
        }
    }
于 2012-11-28T16:43:49.373 回答
0

在 C# 中,返回所有匹配索引的列表:

private IEnumerable<int> FindColor(List<System.Drawing.Color> colorArray, string name)
{
    var colors = GetColors(name);
    var colorStrings = colorArray.Select(y => y.Name.ToString()).ToList();

    return colors.Select(x => colorStrings.IndexOf(x));
}

用例:

FindColor(ColorList, "White,Black,Pink,Polkadot");
// Returns { 1, 0, 7, -1 }

您可以通过返回System.Drawing.Colorfrom列表GetColors()而不是字符串列表来提高效率,但我认为这不会有很大的不同。


此外,如果您只想要最初要求的内容 - 返回匹配序列的第一个索引,您可以对 return 语句中当前的内容进行排序,然后旋转列表以检查间隙。如果找到间隙,则返回 null,否则,返回第一个元素。

于 2012-11-28T16:52:21.240 回答