4

我正在开发 c# 应用程序,我想完成以下任务:

我有 12 个复选框,用于 12 个项目,用户可以选中任何一个复选框。如果已选中复选框 3、4、5、6、8、10、11、12,我想显示以下输出。

您已选择项目 3-6,8,10-12。

规则:

当连续数组数为3或大于3时,显示分组如3-6

否则显示个人编号。8

4

5 回答 5

1

首先,我建议您在字符串中附加所有复选框的值,如您所示。

函数调用:

 string data = "3,5,6,7,8,10,12";
 string res = GetResultString(data);

功能 :

    string GetResultString(string data)
    {
        string[] arrData = data.Split(',').ToArray();
        List<int> lstData = new List<int>();
        foreach (string item in arrData)
        {
            lstData.Add(Convert.ToInt16(item));
        }

        lstData.Sort();
        string finalStr = string.Empty;
        if (lstData.Count > 0)
        {
            int start = lstData[0];
            int end = start;
            finalStr = string.Empty;
            for (int index = 1; index < lstData.Count; index++)
            {
                if (end + 1 == lstData[index])
                {
                    end = lstData[index];
                }
                else
                {
                    finalStr += appendResult(start, end);
                    start = -1;
                }

                if (start == -1)
                {
                    start = lstData[index];
                    end = lstData[index];
                }
            }
            finalStr += appendResult(start, end);
        }
        finalStr = finalStr.Trim(',');
        return finalStr;
    }

    string appendResult(int start,int end)
    {
        string res = string.Empty;
        if (end - start > 1)
        {
            res += start + "-" + end.ToString() + ",";
            start = -1;
        }
        else
        {
            while (start <= end)
            {
                res += start.ToString() + ",";
                start++;
            }
        }
        return res;
    }

希望这会完成你的工作,

于 2013-09-12T12:26:30.097 回答
0

You might have got the solution,but all the above solutions use string for appending data..You could use StringBuilder for optimized performance.

List<int> selectedCB = new List<int>() { 3, 4, 6, 7, 8, 9, 11, 12 };
string output = GetFormattedOutput(selectedCB);

The code for formatting data..

private string GetFormattedOutput(List<int> selectedCB)
    {
        // Can be changed if you want to increase
        // groupby range
        int rangeBy = 3;    
        int diffBy = 1;
        int prevValue = 0;
        List<int> tempList = new List<int>();
        StringBuilder formattedOutput = new StringBuilder();

        foreach (int currentValue in selectedCB)
        {
            var diff = currentValue - prevValue;

            if(tempList.Count != 0 && diff > diffBy)
            {
                // Add the value in templist to formatted output
                // If three are more numbers are in range
                // Add the first and last
                if (tempList.Count >= rangeBy)
                {
                    formattedOutput.Append(tempList[0].ToString() + "-" +
                                           tempList[tempList.Count - 1].ToString()+",");
                }
                else
                {
                    AppendText(formattedOutput, tempList);
                }
                tempList.Clear();
            }
            tempList.Add(currentValue);
            prevValue = currentValue;
        }
        if (tempList.Count != 0)
        {
            AppendText(formattedOutput, tempList);
        }
        formattedOutput.Remove(formattedOutput.Length - 1, 1);
        return formattedOutput.ToString();
    }
    // To append the numbers in the list
    string AppendText(StringBuilder output, List<int> tempList)
    {
        foreach (var temp in tempList)
        {
            output.Append(temp.ToString() + ",");
        }
        return output.ToString();
    }
于 2013-09-17T07:13:07.480 回答
0

尝试这个

        var data = new List<int> { 3, 4, 5, 6, 8, 10, 11, 12 };
        // data.Sort();
        var groups = new List<string>();

        var startIndex = 0;
        for (var i = 1; i < data.Count; i++)
        {
            if (data[i - 1] == data[i] - 1)
            {
                continue;
            }

            groups.Add(startIndex == i - 1
                ? data[startIndex].ToString()
                : data[startIndex] + "-" + data[i - 1] );
            startIndex = i;
        }
        groups.Add(startIndex == data.Count - 1
                ? data[startIndex].ToString()
                : data[startIndex] + "-" + data[data.Count - 1]);

        var result = string.Join(",", groups);

第 2 版

    [Fact]
    public void Test()
    {
        var data = new List<int> { 3, 4, 5, 7, 8, 10, 11, 12 };
        // data.Sort();
        var groups = new List<string>();

        var startIndex = 0;
        for (var i = 1; i < data.Count; i++)
        {
            if (data[i - 1] == data[i] - 1)
            {
                continue;
            }

            AddToGroups(groups, startIndex, i, data);
            startIndex = i;
        }
        AddToGroups(groups, startIndex, data.Count, data);

        var result = string.Join(",", groups);


        Assert.Equal("3-5,7,8,10-12", result);
    }

    private static void AddToGroups(List<string> groups, int startIndex, int actualIndex, List<int> data)
    {
        switch (actualIndex - startIndex)
        {
            case 1:
                groups.Add(data[startIndex].ToString());
                break;
            case 2:
                groups.Add(data[startIndex].ToString());
                groups.Add(data[startIndex + 1].ToString());
                break;
            default:
                groups.Add(data[startIndex] + "-" + data[actualIndex - 1]);
                break;
        }
    }
于 2013-09-12T13:07:25.423 回答
0

试试这个..它会工作我测试过

我还没有创建复选框,所以由您来检查选择了哪个复选框 从选定的复选框 3、4、5、6、8、10、11、12 中获取字符串

       string str1 = "3,4,5,6,8,10,11,12";
        string[] strArr = str1.Split(',');
        List<string> strFinal = new List<string>();
        int[] myInts = Array.ConvertAll(strArr, s => int.Parse(s));
        int arrLn = myInts.Length;
        Array.Sort(myInts);
        int intPrevVal = myInts[0];
        int intPrevDiff = myInts[0];
        int seriesCount = 1;
        strFinal.Add(Convert.ToString(myInts[0]));

        for (int j = 1; j < arrLn; j++)
        {
            int intCurr = myInts[j];
            if (intCurr - intPrevVal == 1)
            {
                seriesCount++;
            }
            else
            {
                if (seriesCount >= 3)
                {
                    strFinal[strFinal.Count - 1] = strFinal[strFinal.Count - 1] + "-" + intPrevVal;
                    seriesCount = 1;
                }
                else if (seriesCount == 2)
                {
                    strFinal.Add(Convert.ToString(myInts[j - 1]));
                    seriesCount = 1;
                    //strFinal.Add(Convert.ToString(myInts[j]));
                }
                strFinal.Add(Convert.ToString(myInts[j]));
            }
            intPrevVal = intCurr;
        }
        if (seriesCount >= 3)
        {
            strFinal[strFinal.Count - 1] = strFinal[strFinal.Count - 1] + "-" + myInts[arrLn - 1];
        }
        else if (seriesCount == 2)
        {                
            strFinal.Add(Convert.ToString(myInts[arrLn - 1]));
        }
        string FinalAns = string.Join(",", strFinal.ToArray());
        Response.Write(FinalAns);
于 2013-09-12T12:25:51.500 回答
0

我想你用数组(新......)做了你的复选框,如果不是手动做......

int min=13;
int max=0;
string s = "";

for (int i = 0; i<12; i++)
{
    if (cb[i].checked && i<min)
        min = i;
    else if (cb[i].checked == false)
        if (min != 13)
        {
            max = i-1;
            s = s + min.ToString() + "-" + max.ToString() + " ";
            min = 13;
        }
}

if (cb[11].checked) s = s + min.ToString() + "-12"; // for case the last one is checked
// s contains your data

(我没有检查它,但我认为它需要是这样的。)

于 2013-09-12T10:53:26.670 回答