C# 基于另一个 List对列表<字符串重新排序>

本文关键字:新排序 排序 字符串 另一个 List string 列表 | 更新日期: 2023-09-27 18:37:22

这里的答案是一个开始在 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]);
}

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

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

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

    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) 
                );