C# 用于填充组合框C的排序列表#

C# 用于填充组合框C的排序列表#,c#,sorting,combobox,C#,Sorting,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.Sorte

您好,我有这样的代码来填充组合框:

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;
}
结果我得到了如下排序的值:

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

通过字符串数组构建ArrayList也是如此

有人能帮我按我想要的方式分类吗

提前谢谢

编辑:值可以是 4545_3434.2.1/1 4545_3434.2.1/2 4545_3434.2.2 4545_3434.2.2/1这应该可以:

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

(如果是带有版本号的数组)

从ListBox派生并覆盖实现您自己算法的排序方法。例如,Feroc提出的建议

检查以下链接:
以下是我的建议。不需要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;
}

如果希望将数字视为版本,可以使用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;
}

您可以在代码中使用自定义比较器(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;
    }
}
类程序
{
私有静态数组列表arl;
公共静态void Main(字符串[]args)
{
arl=新的ArrayList();
arl.添加(“2.1/1”);
arl.添加(“2.1/2”);
arl.添加(“2.2”);
arl.添加(“2.2/1”);
arl.Sort(新的IDDSort());
foreach(arl中的var值)
{
控制台写入线(值);
}
Console.Read();
}
}
公共类IDDSort:IComparer
{
公共整数比较(对象x、对象y)
{
如果(x==y)返回0;
var xparts=x.ToString().Replace(“/”,“”)。Split(“.”);
var yparts=y.ToString().Replace(“/”,“”)。Split(“.”);
var length=new[]{xparts.length,yparts.length}.Max();
对于(变量i=0;iyint)返回1;
如果(yint>xint)返回-1;
}
//它们是相等的值,但不是相等的字符串,例如1和1.0
返回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();
现在我把它分类如下: 1.1 1.2 0001.2/1 0001.2/2 1.3 0001.3/1 等等


谢谢大家的帮助。

将项目添加为
double
或类似类型,它将正确排序。字符串的排序不同于数字排序。为什么2.2比2.10“小”?即使是string或double也会像您得到的那样进行排序。您能定义规则吗?排序不会很复杂。@user2136076,因为它是字符串。绳子上没有更小更大的。字符串排序规则不同。我想这是因为
2.2
的长度是3,而as
2.10
的长度是4。@user2136076-如果这些是版本号,那么2.2小于2.10。您需要解释新值的预期输出应该是什么。什么是
AlphanumComparatorFast()
?我尝试了类似的方法。但不是工作。公共类IDDSort:IComparer{public int Compare(object a,object b){decimal aDec;decimal bDec;if(decimal.TryParse((string[])a[1]。Split('..)[(string[])a[1]。Split('.')。Length-1]。Replace(“/”,“”),out-aDec)和decimal.TryParse((string[])b[1]。Split('.)[(string[])b[1]。Split('.')).Length-1).替换(“/”,“”),out bDec)){return aDec.CompareTo(bDec);}返回0;}