2013-07-08 5 views
0

Я создал список классов C# с тремя полями. в этих полях также указывается идентификатор устройства, режим устройства, время. У меня был список моих классов по времени. список времени сортируется успешно, но список режимов устройства не сортируется относительно списка времени. как я могу это достичь. мой пример кода, приведенный ниже.Сортировка списка по отношению к другому списку

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace PBAttendance.App_Code 
{ 
    public class DeviceLogData 
    { 
     List<int> deviceID = new List<int> { }; 
     List<int> deviceMode = new List<int> { }; 
     List<DateTime> time = new List<DateTime> { }; 
     public List<int> DeviceID 
     { 
      get { return deviceID; } 
      set { deviceID = value; } 
     } 
     public List<int> DeviceMode 
     { 
      get { return deviceMode; } 
      set { deviceMode = value; } 
     } 
     public List<DateTime> Time 
     { 
      get { return time; } 
      set { time = value; } 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace PBAttendance.App_Code 
{ 
    public class DeviceLogDataList:List<DeviceLogData> 
    { 
    } 
} 

DeviceLogDataList dvclogDataList = new DeviceLogDataList(); 
DeviceLogData dvclogData = new DeviceLogData(); 
dvclogData.DeviceID.Add(1); 
dvclogData.DeviceMode.Add(1); 
dvclogData.Time.Add(DateTime.ParseExact("10:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)); 
dvclogData.DeviceID.Add(1); 
dvclogData.DeviceMode.Add(1); 
dvclogData.Time.Add(DateTime.ParseExact("10:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)); 
dvclogData.DeviceID.Add(1); 
dvclogData.DeviceMode.Add(2); 
dvclogData.Time.Add(DateTime.ParseExact("12:51", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)); 
dvclogData.DeviceID.Add(1); 
dvclogData.DeviceMode.Add(2); 
dvclogData.Time.Add(DateTime.ParseExact("09:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)); 
dvclogData.DeviceID.Add(1); 
dvclogData.DeviceMode.Add(1); 
dvclogData.Time.Add(DateTime.ParseExact("13:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)); 

dvclogDataList.Add(dvclogData); 

dvclogDataList[0].Time.Sort(); 

Список время сортируется по 09: 49,10: 49,10: 49,12: 51,13: 49 отлично, но режим устройства и идентификатор устройства не отсортирован по списку времени. как это можно достичь. пожалуйста помогите. Извините за мой плохой английский. заранее спасибо.

+0

ли все списки аспекты одного и того же элемента. Например: Идентификатор устройства [0] указывает на тот же элемент, что и DeviceMode [0]. Если да, я бы создал базовый класс с именем device, который содержит все ваши DiviceModes, ID и т. Д. Этот список можно легко отсортировать. Это будет иметь то преимущество, что никто не сможет «пропустить» ваши данные. –

+0

Как время, так и режим, хотя и являются частью того же экземпляра класса, они представляют собой совершенно разные списки. поэтому я не думаю, что сортировка одного списка будет иметь какое-либо влияние на другой список. – Rakesh

+0

проверить это: http://stackoverflow.com/questions/7099741/c-sharp-list-sort-by-two-columns, http: // stackoverflow.com/questions/289010/c-sharp-list-sort-by-x-then-y – Arie

ответ

5

Вы должны создать простой класс, который содержит данные:

public class DeviceLogData { 
    public int DeviceID{get; set;} 
    public int DeviceMode{get; set;} 
    public DateTime Time {get; set;} 
} 

void Foo(){ 

    var theList = new List<DeviceLogData>(); 
    theList.Add(new DeviceLogData{ 
     DeviceID: 42, 
     DeviceMode: 66, 
     Time = DateTime.Now 
    }); 

    ... 

    var ordered = theList.OrderBy(log=>log.Time); 
    foreach(var log in ordered) 
    { 
      DoSomethingWithLog(log); 
    } 
} 

[править]

Как Servy отметил, вы можете также отсортировать список а не перечислять его содержимое.

Вы можете использовать Comparison:

List<DeviceLogData> theList = new List<DeviceLogData>(); 
theList.Add(new DeviceLogData{  DeviceID: 42,  DeviceMode: 66,  Time = DateTime.Now }); 
theList.Add(new DeviceLogData{  DeviceID: 43,  DeviceMode: 67,  Time = DateTime.Now }); 

var comparer = new Comparison<DeviceLogData>( 
    // Use the Time property to compare the custom object 
    (log1, log2) => log1.Time.CompareTo(log2.Time) 
    ); 

theList.Sort(comparer); 

[конец редактирования]

Ключевым моментом является то, что данные, связанные друг с другом в рамках одного объекта. Для сравнения, синхронизация данных, когда они разделены на несколько списков, может быть сложной задачей.

Дополнительный совет:

Вы должны смотреть на многих доступных общих списков. Например, вы также можете использовать Dictionary<int,DeviceLogData>, чтобы иметь возможность извлекать данные по идентификатору.

+0

Вы говорите о 'System.Collections.Generic.SortedList '? – Henrik

+0

На самом деле более эффективно добавлять элементы в «Список», а затем сортировать их, а не добавлять элементы в «SortedList». 'SortedList', в большинстве случаев, уступает другой коллекции для любой конкретной задачи. Я почти никогда не считал, что это лучшая коллекция для любой заданной работы. – Servy

+0

@ Хенрик: да, я пропустил первый общий аргумент. Спасибо –

1

Необходимо как-то связать списки. Возможно, сделайте List с кортежем в нем, удерживая ваши предметы, а затем отсортируйте по первому полю кортежа.

В качестве альтернативы изготовите DeviceLogEntry с элементами Time, DeviceID и DeviceMode.

Вы, по-видимому, хотите, чтобы целостность была такой моделью для этого.

0

Может быть, это может помочь на то, что вам нужно выполнить:

public class DeviceLogData 
    { 
     private static SortedDictionary<DateTime, string> sorteditems = new SortedDictionary<DateTime, string>(); 

     public int DeviceID { get; set; } 
     public int DeviceMode { get; set; } 
     public DateTime Time { get; set; } 

     public DeviceLogData(int id,int mode,DateTime dt) 
     { 
      DeviceID = id; 
      DeviceMode = mode; 
      Time = dt; 
      sorteditems.Add(dt, string.Format("At {0} Device with Id -> {1} and mode -> {2} has logged!", dt, id, mode)); 
     } 

     public static SortedDictionary<DateTime, string> GetRecords() 
     { 
      return sorteditems; 
     } 
    } 

затем использовать его, вы можете сделать это:

  List<DeviceLogData> dlr = new List<DeviceLogData>(); 
      dlr.Add(new DeviceLogData(1, 1, DateTime.ParseExact("12:51", "HH:mm", System.Globalization.CultureInfo.InvariantCulture))); 
      dlr.Add(new DeviceLogData(1, 2, DateTime.ParseExact("10:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture))); 
      dlr.Add(new DeviceLogData(1, 1, DateTime.ParseExact("13:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture))); 
      dlr.Add(new DeviceLogData(1, 1, DateTime.ParseExact("09:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture))); 
      dlr.Add(new DeviceLogData(1, 3, DateTime.ParseExact("09:48", "HH:mm", System.Globalization.CultureInfo.InvariantCulture))); 
      dlr.Add(new DeviceLogData(1, 1, DateTime.ParseExact("15:31", "HH:mm", System.Globalization.CultureInfo.InvariantCulture))); 

      foreach (var item in DeviceLogData.GetRecords()) 
      { 
       Console.WriteLine(item.Value); 
      } 

      Console.ReadLine(); 
+0

Зачем расширять список? Просто используйте 'List' напрямую. Если вы действительно, действительно не хотите вводить родовое имя, вы можете просто использовать фактический псевдоним, а не наследовать от «List». – Servy

+0

yep, был настолько преподан с попыткой не менять макет, который забыл о базовом:) спасибо. – terrybozzio