我用来填充ComboBox C的排序列表#

时间:2014-10-07 12:45:42

标签: c# sorting combobox

您好,我有代码填写ComboBox,如下所示:

public ListBox fillComboBox(ListBox cb)
{
    cb.Items.Clear();
    foreach(string[] s in SO)
    {
        if (s[1].Split(',')[1].Equals("G5IDD"))
        {
            cb.Items.Add(s[1].Split(',')[3]);
        }
    }
    cb.Sorted = true;
    return cb;
}

结果我得到的值如下:

2.1 2.10 2.15 2.2 2.20

但我希望它像这样排序

2.1 2.2 2.10 2.15 2.20

SO是由Array of Arrays构建的ArrayList。

有人能帮助我按我想要的方式排序吗?

提前致谢

编辑:价值观可能就像 4545_3434.2.1 / 1 4545_3434.2.1 / 2 4545_3434.2.2 4545_3434.2.2 / 1

6 个答案:

答案 0 :(得分:2)

这是我的建议。不需要IComparer。这显然假设输入将始终采用[int]。[int]。

的格式
public ListBox fillComboBox(ListBox cb)
{
    cb.Items.Clear();
    foreach(string[] s in SO.ToArray().OrderBy(s => Int32.Parse(s.ToString().Split('.')[0])).ThenBy(s => Int32.Parse(s.ToString().Split('.')[1])))
    {
        if (s[1].Split(',')[1].Equals("G5IDD"))
        {
            cb.Items.Add(s[1].Split(',')[3]);
        }
    }
    return cb;
}

答案 1 :(得分:2)

如果您希望将数字视为版本,则可以使用Version类。

public Version String2Version(string str)
{
    string[] parts = str.Split('.');
    return new Version(Convert.ToInt32(parts[0]), Convert.ToInt32(parts[1]));
}

public ListBox fillComboBox(ListBox cb)
{
    cb.Items.Clear();
    foreach(string[] s in SO)
    {
        if (s[1].Split(',')[1].Equals("G5IDD"))
        {
            cb.Items.Add( String2Version(s[1].Split(',')[3]));
        }
    }
    cb.Sorted = true;
    return cb;
}

答案 2 :(得分:1)

您可以在代码中使用自定义比较器(IComparer)来实现它, 我提供了一个例子。你必须改变

的逻辑
public int Compare(object a, object b)

达到您的特定要求

class Program
{
    private static ArrayList arl;

    public static void Main(string[] args)
    {
        arl = new ArrayList();

        arl.Add("2.1/1");
        arl.Add("2.1/2");
        arl.Add("2.2");
        arl.Add("2.2/1");
        arl.Sort(new IDDSort());
        foreach (var value in arl)
        {
            Console.WriteLine(value);
        }
        Console.Read();           
    }
}


public class IDDSort : IComparer
{
    public int Compare(object x, object y)
    {
        if (x == y) return 0;

        var xparts = x.ToString().Replace("/","").Split('.');
        var yparts = y.ToString().Replace("/", "").Split('.');

        var length = new[] { xparts.Length, yparts.Length }.Max();

        for (var i = 0; i < length; i++)
        {
            int xint;
            int yint;

            if (!Int32.TryParse(xparts.ElementAtOrDefault(i), out xint)) xint = 0;
            if (!Int32.TryParse(yparts.ElementAtOrDefault(i), out yint)) yint = 0;

            if (xint > yint) return 1;
            if (yint > xint) return -1;
        }

        //they're equal value but not equal strings, eg 1 and 1.0
        return 0;
    }
}

答案 3 :(得分:0)

这应该有效:

Array.Sort(SO, new AlphanumComparatorFast());

(如果SO是包含您的版本号的数组)

答案 4 :(得分:0)

从ListBox派生并覆盖实现您自己的算法的Sort方法。例如Feroc建议的那个。

检查以下链接: http://msdn.microsoft.com/pl-pl/library/system.windows.forms.listbox.sort(v=vs.110).aspx

答案 5 :(得分:0)

您好我通过将部分数组列入列表来实现我的目标。 (我只需要列表中的名称而不是整个数组)。并使用lambda表达式。

list = list.OrderBy(x => Int32.Parse(x.Split('.')[2].Split('/')[0]))
            .ThenBy(x =>
            Int32.Parse(x.Split('.')[2].Split('/').Length > 1 ? x.Split('.')[2].Split('/')[1] : x.Split('.')[2].Split('/')[0])
        ).ToList();

所以现在我把它分类如下: 0001.1 0001.2 0001.2 / 1 0001.2 / 2 0001.3 0001.3 / 1 等

感谢大家的帮助。