C#重新排序列表<string>基于另一个List <string>

时间:2016-03-04 03:41:26

标签: c# linq

这里的答案是一个开始 Rearrange a list based on given order in c#

但是,我想按字符串列表排序。

我更新了我的小提琴(https://dotnetfiddle.net/dWuh8l)试试这个没有运气:

public class kw
{
    public string fkp_keyword { get; set; }
}

public static void Main()
{
    string url = "http://survey.scic.com/Survey/api/DocColumns";
    string parms = String.Concat(url, "/1158341");
    List<kw> kws;
    using (WebClient client = new WebClient())
    {
        client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        string result = client.DownloadString(parms);
        string unescapedJson = JsonConvert.DeserializeObject<string>(result);
        kws =  JsonConvert.DeserializeObject<List<kw>>(unescapedJson);
    }    

    var order = new List<string> { "FILENAME", "DOC_NAME", "PRINT_DATE", "EVENT_CODE", "CE_STATE", "DESIGNATION", "PROGRAM_CODE", "DISTRIBUTION", "COURSE NAME", "RECEIPT_DATE", "REC_RID" }; 

    var res = order.Select(i => kws.FindIndex(s => s.Equals(order.IndexOf((i))))).ToList();

    Console.WriteLine(res[1]);
}

由于我可能有不在订单列表中的项目,它们将被放置在新列表中?

1 个答案:

答案 0 :(得分:2)

您可以选择项目的索引,然后将其扔入匿名对象顺序,然后再次选择字符串:

    var res = kws
            .Select(a=>new{orderOf=order.IndexOf(a.fkp_keyword),val=a})
            .OrderBy(a=>a.orderOf)
            .Select(a=>a.val)
            .ToList();

如果您的订单中没有列出的项目,那么它们将被放在前面,因为IndexOf方法将返回-1。

您也可以轻松过滤它们,只需使用where子句检查-1,如果您需要

   var res = kws
            .Select(a=>new{orderOf=order.IndexOf(a.fkp_keyword),val=a})
            .OrderBy(a=>a.orderOf)
            .Where(a=>a.orderOf!=-1)
            .Select(a=>a.val)
            .ToList();

如果你想将它们添加到列表的末尾,那么你可以分解列表中的那些以及那些不是并且连接它们而不是使用列表的那些。

    var temp = kws
            .Select(a=>new{orderOf=order.IndexOf(a.fkp_keyword),val=a})
            .OrderBy(a=>a.orderOf);

    var res = temp
                .Where(a=>a.orderOf != -1)
                .Select(a=>a.val)
                .Concat(
                     temp.Where(a=>a.orderOf==-1).Select(a=>a.val) 
                );