排序列表,我用它来填充组合框C#
本文关键字:填充 组合 列表 排序 | 更新日期: 2023-09-27 18:25:51
你好,我有这样的代码来填充组合框:
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.12.102.152.22.20
但我希望它像一样分类
2.12.22.102.152.20
SO是由字符串数组构建的ArrayList。
有人能帮我按我想要的方式分类吗?
提前感谢
EDIT:值可以是4545_3434.2.1/14545_3434.2.1/24545_3434.2.24545_3434.2.2/1
以下是我的建议。不需要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;
}
}
这应该有效:
Array.Sort(SO, new AlphanumComparatorFast());
(如果SO是带有您的版本号的数组)
从ListBox派生并重写实现自己算法的Sort方法。例如Feroc提出的。
检查下面的链接:http://msdn.microsoft.com/pl-pl/library/system.windows.forms.listbox.sort(v=vs.110).aspx
你好,我通过将数组的一部分复制到列表来实现我的目标。(我只需要列表中的名称,而不需要整个数组)。并使用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.11.20001.2/10001.2/21.30001.3/1等
感谢大家的帮助。