大家好,我一直在阅读许多与我想要的问题类似的帖子但不幸的是,其中任何一个都与我的问题相符。实际上我有用于填充下拉列表的字典,因为字典中的值不可能按字母顺序排列(没有一致性,你会在下面的代码中看到这些值)我怎么能创建一个数组或者带有序号的列表,按此ID对值进行排序,然后将有组织的值放入新的字典中......或任何其他方式。感谢您的快速帮助。
这实际上是我的代码:
public static Dictionary<string, string> GetDocumentTypes()
{
Dictionary<string, string> docTypeList = new Dictionary<string, string>();
//Values inserted manually for the moment
docTypeList.Add(Guid.NewGuid().ToString(), "F17- MyValue17");
docTypeList.Add(Guid.NewGuid().ToString(), "F19- MyValue19");
docTypeList.Add(Guid.NewGuid().ToString(), "F20- MyValue20");
docTypeList.Add(Guid.NewGuid().ToString(), "F21- MyValue21");
docTypeList.Add(Guid.NewGuid().ToString(), "F2- MyValue2");
docTypeList.Add(Guid.NewGuid().ToString(), "F1- MyValue1");
docTypeList.Add(Guid.NewGuid().ToString(), "F3- MyValue3");
docTypeList.Add(Guid.NewGuid().ToString(), "F4- MyValue4");
return docTypeList;
}
//在这里,我尝试使用这些值填充下拉列表&#34; ordered&#34;
字典doctypesource = GetDocumentTypes();
var ordered = doctypesource.OrderBy(x => x.Value);
DocumentType.DataSource = ordered;
DocumentType.DataValueField = "Key";
DocumentType.DataTextField = "Value";
DocumentType.DataBind();
DocumentType.Items.Insert(0, new ListItem());
最后,当填充下拉列表时,不会对这些值进行排序,但它们会得到如下命令:F1- MyValue1,F17- MyValue17,F19- MyValue19,F2- MyValue2,F20- MyValue20,F21- MyValue21,F3- MyValue3 ,F4- MyValue4;
所以我希望这样的顺序:F1- MyValue1,F2- MyValue2,F3- MyValue3,F4- MyValue4,F17- MyValue17,F19- MyValue19,F20- MyValue20,F21- MyValue21
答案 0 :(得分:0)
值是字符串,因此它们按字母数字排序。因此,“F17- MyValue17”将出现在“F2- MyValue2”之前是正确的,因为第二个字符在第一个值中为1,在第二个值中为2。
如果您能够使用前导零填充值,则排序将起作用。例如,您将使用以下
docTypeList.Add(Guid.NewGuid().ToString(), "F17- MyValue17");
docTypeList.Add(Guid.NewGuid().ToString(), "F19- MyValue19");
docTypeList.Add(Guid.NewGuid().ToString(), "F20- MyValue20");
docTypeList.Add(Guid.NewGuid().ToString(), "F21- MyValue21");
docTypeList.Add(Guid.NewGuid().ToString(), "F02- MyValue02");
docTypeList.Add(Guid.NewGuid().ToString(), "F01- MyValue01");
docTypeList.Add(Guid.NewGuid().ToString(), "F03- MyValue03");
docTypeList.Add(Guid.NewGuid().ToString(), "F04- MyValue04");
如果您不能这样做,则需要提取字符串的数字部分以用于排序。你如何做到这取决于你如何获得这些文本值。
以下内容适用于使用您拥有的值格式的示例代码
var ordered = docTypeList.OrderBy(x => int.Parse(new string(x.Value.SkipWhile(c => !char.IsNumber(c)).TakeWhile(char.IsNumber).ToArray())));
这是另一种可能的解决方案,首先按字符串的第一部分进行排序,然后根据第一个数字部分(如果有的话)进行排序。同样,它适用于您在注释中提供的示例值,但可能不适用于您希望排序的每个值。例如,如果您有“F1-A”和“F1-B”,它将按F排序,然后按1排序,但它会忽略字符串的其余部分,因此如果在A中找到B,则B可以在A之前首先是字典。
docTypeList.Add(Guid.NewGuid().ToString(), "C");
docTypeList.Add(Guid.NewGuid().ToString(), "F17");
docTypeList.Add(Guid.NewGuid().ToString(), "F1");
docTypeList.Add(Guid.NewGuid().ToString(), "B");
docTypeList.Add(Guid.NewGuid().ToString(), "F");
docTypeList.Add(Guid.NewGuid().ToString(), "F2");
docTypeList.Add(Guid.NewGuid().ToString(), "Z");
docTypeList.Add(Guid.NewGuid().ToString(), "F20");
docTypeList.Add(Guid.NewGuid().ToString(), "X");
docTypeList.Add(Guid.NewGuid().ToString(), "A");
docTypeList.Add(Guid.NewGuid().ToString(), "Y");
var ordered = docTypeList.OrderBy(x => new string(x.Value.TakeWhile(c => !char.IsDigit(c)).ToArray()))
.ThenBy(x => int.Parse(
x.Value.Any(char.IsDigit) ? new string(x.Value.SkipWhile(c => !char.IsDigit(c)).TakeWhile(char.IsDigit).ToArray()) : "0"
));
答案 1 :(得分:0)
将IComparer传递给OrderBy,考虑到您的号码在F之后有2位数,以下是答案,您可以对所有情况进行适当的修改
axis =2