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 で見つかります。2 つの色が隣り合っているため、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.Colorおそらく、文字列のリストの代わりにfromのリストを返すことで、もう少し効率的にすることができますがGetColors()、大きな違いはないと思います。


また、最初に要求したものだけが必要な場合は、一致するシーケンスの最初のインデックスを返すために、現在 return ステートメントにあるものを並べ替えてから、リストをスピンオーバーしてギャップを確認できます。ギャップが見つかった場合は null を返し、それ以外の場合は最初の要素を返します。

于 2012-11-28T16:52:21.240 に答える