按字母顺序组织字典中的值

时间:2016-05-12 16:45:14

标签: c# asp.net arrays list dictionary

大家好,我一直在阅读许多与我想要的问题类似的帖子但不幸的是,其中任何一个都与我的问题相符。实际上我有用于填充下拉列表的字典,因为字典中的值不可能按字母顺序排列(没有一致性,你会在下面的代码中看到这些值)我怎么能创建一个数组或者带有序号的列表,按此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

2 个答案:

答案 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