在逗号分隔的字符串中为每个值迭代数组

时间:2012-11-28 16:14:16

标签: c# javascript asp.net asp.net-mvc

我有一系列颜色。

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查看是否在阵列中找到每个分割的字符串颜色。 所以在这种情况下,Red在4处找到,Purple在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;
}

有人可以推荐最好的方法来检查这样的案例吗?

2 个答案:

答案 0 :(得分: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;
        }
    }

答案 1 :(得分: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));
}

USECASE:

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

你可以通过从System.Drawing.Color而不是字符串列表中返回GetColors()列表来提高效率,但我认为它不会产生很大的影响


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