【问题标题】:C# Reordering List<string> based on another List<string>C# 基于另一个 List<string> 重新排序 List<string>
【发布时间】:2016-03-04 03:41:25
【问题描述】:

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

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

【问题讨论】:

  • 您不应该用答案或解决方案来更新您的问题。如果现有答案不充分,您可以根据需要添加自己的答案。

标签: c# linq


【解决方案1】:

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

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

【讨论】:

  • 当我检查排序时,它确实显示了开头不在列表中的那些。我怎样才能将它们移到最后?
  • 查看上面的更新以获得最终解决方案。我不得不使用 2 个对象并循环将不按顺序的对象添加到按顺序排列的对象中。
  • @MB34 更新了我的答案,将未找到的答案添加到列表的后面
猜你喜欢
  • 2015-02-14
  • 2020-02-06
  • 2016-11-25
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2016-09-24
  • 1970-01-01
相关资源
最近更新 更多