如何为复选框编码以获取模式输出的说明如下

本文关键字:输出 说明 模式 复选框 编码 获取 | 更新日期: 2023-09-27 18:31:06

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

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

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

规则:

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

否则显示个人编号。8

如何为复选框编码以获取模式输出的说明如下

首先,

我建议您像您显示的那样在字符串中附加所有复选框的值。

函数调用:

 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;
    }

希望这会完成你的工作,

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

我还没有创建复选框,所以由您来检查选中的复选框 从选定的复选框 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);
我想

你用数组(新...)做了你的复选框,如果不这样做的话......

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

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

试试这个

        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;
        }
    }
您可能

已经得到了解决方案,但上述所有解决方案都使用字符串来附加数据。您可以使用 StringBuilder 来优化性能。

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

用于格式化数据的代码..

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();
    }