对列表进行排序,其中每个元素包含2个值

时间:2017-08-22 08:17:16

标签: c# sorting

我有一个文本文件,其中包含以下格式的值: for (var z=0; z<dlength; z++) { var thead = "<thead class='thead"+z+"'><tr><th class='center'><label class='pos-rel'><input type='checkbox' class='ace'><span class='lbl'></span></label></th><th class='center'>"+disarray[z]+"</th></tr></thead>"; $('#add-table').append(thead); alldata.forEach(function(e, i){ if(alldata[i]['section_name'] == disarray[z]){ var tbody = "<tbody class='tbody"+z+"'><tr><td class='center'><label class='pos-rel'><input type='checkbox' class='ace'><span class='lbl'></span></label></td><td>"+alldata[i]['emp_Fullname']+"</td></tr></tbody>" $('#add-table').append(tbody); console.log(alldata[i]['section_name']); } }); //And for the first simple table, which doesn't have TableTools or dataTables //select/deselect all rows according to table header checkbox var active_class = 'active'; //Here is the change thead.thead0 $("#add-table > thead.thead0 > tr > th input[type=checkbox]").eq(0).on('click', function(){ var th_checked = this.checked;//checkbox inside "TH" table header $(this).closest('table').find("tbody.tbody0 > tr").each(function(){ var row = this; if(th_checked) $(row).addClass(active_class).find('input[type=checkbox]').eq(0).prop('checked', true); else $(row).removeClass(active_class).find('input[type=checkbox]').eq(0).prop('checked', false); }); }); console.log(z); //Here is the change thead.thead1 $("#add-table > thead.thead1 > tr > th input[type=checkbox]").eq(0).on('click', function(){ var th_checked = this.checked;//checkbox inside "TH" table header $(this).closest('table').find("tbody.tbody1 > tr").each(function(){ var row = this; if(th_checked) $(row).addClass(active_class).find('input[type=checkbox]').eq(0).prop('checked', true); else $(row).removeClass(active_class).find('input[type=checkbox]').eq(0).prop('checked', false); }); }); $("#add-table > thead.thead2 > tr > th input[type=checkbox]").eq(0).on('click', function(){ var th_checked = this.checked;//checkbox inside "TH" table header $(this).closest('table').find("tbody.tbody2 > tr").each(function(){ var row = this; if(th_checked) $(row).addClass(active_class).find('input[type=checkbox]').eq(0).prop('checked', true); else $(row).removeClass(active_class).find('input[type=checkbox]').eq(0).prop('checked', false); }); }); $("#add-table > thead.thead3 > tr > th input[type=checkbox]").eq(0).on('click', function(){ var th_checked = this.checked;//checkbox inside "TH" table header $(this).closest('table').find("tbody.tbody3 > tr").each(function(){ var row = this; if(th_checked) $(row).addClass(active_class).find('input[type=checkbox]').eq(0).prop('checked', true); else $(row).removeClass(active_class).find('input[type=checkbox]').eq(0).prop('checked', false); }); }); //select/deselect a row when the checkbox is checked/unchecked $('#add-table').on('click', 'td input[type=checkbox]' , function(){ var $row = $(this).closest('tr'); if(this.checked) $row.addClass(active_class); else $row.removeClass(active_class); }); }

Time|ID

现在我想按时间对它们进行排序。输出也应该是:

180|1
60 |2
120|3

我该如何解决这个问题?有了这个:

60 |2
120|3
180|1

我没有成功......

5 个答案:

答案 0 :(得分:4)

完成这项工作需要3个步骤:

1)由分隔符

分割

2)转换为int,因为在字符串比较中,6位于1或10之后

3)使用OrderBy对您的收藏品进行排序

以下是执行所有3个步骤的一行中的linq解决方案:

list = list.OrderBy(x => Convert.ToInt32(x.Split('|')[0])).ToList();

解释

x => lambda表达式,x表示列表中的单个元素
x.Split('|')[0]分割每个字符串并仅占用它的第一部分(时间)
Convert.ToInt32(..将时间转换为数字,以便按照您希望的方式进行排序

list.OrderBy(对您的收藏品进行排序

修改

只是为了理解为什么你在这里得到结果是一个使用CompareTo方法比较字符串表示中数字的例子:

int res = "6".CompareTo("10");

res的值为1(意味着6大于10或6跟随10)

根据文件 - &gt;备注:

  

CompareTo方法主要用于排序或字母顺序操作。

答案 1 :(得分:1)

您应该解析文件内容的每一行,并将值作为数字。

string[] lines = File.ReadAllLines("path");

//                         ID, time
var dict = new Dictionary<int, int>();

// Processing each line of the file content
foreach (var line in lines)
{
    string[] splitted = line.Split('|');

    int time = Convert.ToInt32(splitted[0]);
    int ID = Convert.ToInt32(splitted[1]);

    // Key = ID, Value = Time
    dict.Add(ID, time);
}

var orderedListByID = dict.OrderBy(x => x.Key).ToList();
var orderedListByTime = dict.OrderBy(x => x.Value).ToList();

请注意,我将ID引用用作字典Key,假设ID应该是唯一的。

短代码

//                                                                      Key = ID                    Value = Time
var orderedListByID = lines.Select(x => x.Split('|')).ToDictionary(x => Convert.ToInt32(x[1]), x => Convert.ToInt32(x[0])).OrderBy(x => x.Key).ToList();
var orderedListByTime = lines.Select(x => x.Split('|')).ToDictionary(x => Convert.ToInt32(x[1]), x => Convert.ToInt32(x[0])).OrderBy(x => x.Value).ToList();

答案 2 :(得分:0)

您需要先将它们转换为数字。按字符串排序不会给你带来有意义的结果。

times = list.Select(l => l.Split('|')[0]).Select(Int32.Parse);
ids   = list.Select(l => l.Split('|')[1]).Select(Int32.Parse);

pairs = times.Zip(ids, (t, id) => new{Time = t, Id = id})
             .OrderBy(x => x.Time)
             .ToList();

答案 3 :(得分:0)

谢谢大家,这是我的解决方案:

    var path = @"C:\Users\admin\Desktop\test.txt";

    List<string> list = File.ReadAllLines(path).ToList();
    list = list.OrderBy(x => Convert.ToInt32(x.Split('|')[0])).ToList();

    for(var i = 0; i < list.Count; i++)
    {
        Console.WriteLine(list[i]);
    }

答案 4 :(得分:0)

import java.util.ArrayList;  
import java.util.Collections;   
import java.util.List;

public class TestClass {

    public static void main(String[] args) {
    List <LineItem> myList = new ArrayList<LineItem>();     
   myList.add(LineItem.getLineItem(500, 30));    
   myList.add(LineItem.getLineItem(300, 20));    
   myList.add(LineItem.getLineItem(900, 100));  
   System.out.println(myList);

  Collections.sort(myList);

  System.out.println("list after sort");

  System.out.println(myList);



    }

}


class LineItem  implements Comparable<LineItem>{
    int time;
    int id ;
    @Override
    public String toString() {
        return ""+ time + "|"+ id  + "  ";
    }
    @Override
    public int compareTo(LineItem o) {
        return this.time-o.time;
    } 

    public static LineItem getLineItem( int time, int id ){
        LineItem l = new LineItem();
        l.time=time;
        l.id=id;
        return l;
    }
}