2013-10-03 2 views
0

Я довольно новыми для C#Массивы/Списки массивов

Я пытаюсь получить некоторую информацию из внешнего источника данных и сохранить его в массиве, когда он находится в массиве Я хочу, чтобы отсортировать его по времени.

Я знаю, как это сделать только для одного столбца в строке, однако требуемая информация имеет несколько столбцов.

Например:

foreach (Appointment Appoint in fapts) 
{ 
    // Store Appoint.Subject, Appoint.Start, Appoint.Organiser.Name.ToString(), Appoint.Location in an array 
} 

// Sort my array by Appoint.Start 

foreach (item in myNewArray) 
{ 
    //print out Appoint.Subject - Appoint.Start, Appoint.Organiser.Name.ToString() and Appoint.location 
} 

Большое спасибо за вашу помощь.

EDIT:

У меня есть несколько источников данных, которые тянут в этом:

foreach (Appointment Appoint in fapts) 
{ 
    // Store Appoint.Subject, Appoint.Start, Appoint.Organiser.Name.ToString(), Appoint.Location in an array 
} 

Отсюда вытекает необходимость сортировки элементов в новом массиве, я знаю, что это не очень ЭФФЕКТИВНАЯ но Eсть никоим образом не получить необходимую мне информацию.

+0

Что такое 'fapts'? Если это коллекция, почему бы не отсортировать ее самостоятельно. – Abhitalks

+5

Ознакомьтесь с методами расширения LINQ и OrderBy и ThenBy, они должны делать то, что вам нужно. http://code.msdn.microsoft.com/SQL-Ordering-Operators-050af19e –

+1

Я общаюсь с richard, он превосходит ответы (сейчас) ниже – Kristof

ответ

2

Непонятно, какова ваша конечная цель:

Используйте общий List вместо массива:

Смотрите эту SO question для получения дополнительной информации о том, почему использование List является предпочтительным.

List<Appointment> appointments = new List<Appointment>(); 

foreach (Appointment Appoint in fapts) 
{ 
    appointments.Add(Appoint); 
} 

foreach (var item in appointments) 
{ 
    Console.WriteLine(item.Subject); 
    Console.WriteLine(item.Foo); 
    // Here you could override ToString() on Appointment to print eveything in one Console.WriteLine 
} 

Если цель вашего кода на заказ по времени, попробуйте следующее:

var sortedAppointments = fapts.OrderBy(a => a.Start); // assuming Start is a DateTime property of `Appointment`. 
+0

Это все очень хорошо и хорошо, но у меня есть несколько инструкций foreach, по одному для каждой комнаты, поэтому мне нужен массив в первую очередь –

+0

-1 в настоящее время не правильный. 'OrderBy' возвращает' IEnumerable', поэтому вы не можете назначить список. Вы используете цикл 'for', чтобы перейти от массива к списку, тогда вы не скажите ему, как список помогает дальше. – user2586804

+1

Лучшие способы получить из массива в список: 1. 'fapts.ToList();' 2. 'new List (fapts);' – user2586804

0

Рассмотрите объект словаря вместо массива, если данные концептуально содержат одну строку с несколькими столбцами.

foreach(KeyValuePair<string, string> entry in MyDic) 
{ 
    // do something with entry.Value or entry.Key 
} 
+1

ОП имеет «Назначение». Нет необходимости в «Словаре». 'List ' достаточно. –

+0

Согласен, общие списки - мои любимые по очевидной причине, но я не рекомендовал, я думаю, я стараюсь держать их всех в себе;) –

-1

У вас есть широкий выбор опций. 2 наиболее распространенными являются:

1) Создать класс, а затем определить массив или список этого класса, и заселить, что

2) Создать структуру, которая соответствует формату данных и создать массив или список что

Конечно, вы можете поместить данные в формат XML или набор данных, но это, вероятно, больше работы, чем вам нужно.

public List<foo> appointments = new List<foo>(); 
public struct foo 
{ 
public string subject ; 
public DateTime start ; 
public string name ; 
public string location ; 
} 
public void foo1() 
{ 
// parse the file 
while (!File.eof()) 
    { 
     // Read the next line... 
     var myRecord = new foo() ; 
     myRecord.subject = data.subject ; 
     myRecord.start = data.Start ; 
     myRecord.name = data.Name ; 
     //... 
     appointments.Add(myRecord); 
    } 
} 

Наслаждайтесь

(Так как я не могу комментировать и отвечать на комментарии. - это было не ясно, если он был класс, и т.д., или просто показывает нам, что он хотел сделать, я предположил, что это было просто для демонстрационных целей, так как не было никакой информации о том, как считывались данные. Если бы он уже мог помещать его в класс, то в любом случае был применен первый ответ. Я просто бросил последние 2 там, потому что они были варианты получения данных в первую очередь.)

+1

У него уже есть класс ('Назначение'). 'Xml' не требуется. –

3

Вы можете сортировать список с помощью LINQ сортировки операторов OrderBy и ThenBy, как показано ниже.

using System.Linq; 

, а затем ...

var appointments = new List<Appointment>(); 
var sortedAppointments = list.OrderBy(l => l.Subject).ThenBy(l => l.Name).ToList(); 

Это создаст новый список назначений, отсортированные по темам, а затем по имени.

+1

Вы имеете в виду 'OrderBy', а не' SortBy'? – Arion

+0

Правильно, вы Арион, я обновил свой ответ. –

0

У вас уже есть список объектов в FPTS, сортировки, что сам список:

fpts.OrderBy(x => x.Subject).ThenBy(x => x.Location).ToList(); 
0

LINQ является вашим другом здесь.

fapts, похоже, уже является коллекцией, поэтому вы можете просто работать на нем.

var myNewArray = fapts.OrderBy(Appoint => Appoint.Start).ToArray() 

Я использовал ToArray() призыв к моментальному оценки и означает, что myNewArray уже отсортированы так, что если вы используете его больше, чем когда-то вам не придется повторно оценить вид.

В качестве альтернативы, если вы используете это только один раз, вы можете просто пропустить часть ToArray(), а затем выполнение сортировки будет отложено до тех пор, пока вы не попробуете и не перечислите через myNewArray.

Это решение помещает исходные объекты в массив, но если вы просто хотите сохранить определенные поля, которые вы упомянули, вам нужно будет использовать select. У вас есть два варианта для типа элемента массива, вы можете использовать анонимный класс, который создает трудности, если вы возвращаете этот массив из функции или определяете класс.

Для анонимным:

var myNewArray = fapts.OrderBy(Appoint => Appoint.Start) 
         .Select(Appoint => new { 
           Start = Appoint.Start, 
           Organiser = Appoint.Organiser.Name.ToString(), 
           Location = Appoint.Location 
           }).ToArray(); 

Для имени предполагающей класса класса является MyClass:

var myNewArray = fapts.OrderBy(Appoint => Appoint.Start) 
         .Select(Appoint => new MyClass { 
           Start = Appoint.Start, 
           Organiser = Appoint.Organiser.Name.ToString(), 
           Location = Appoint.Location 
           }).ToArray(); 
+1

@RichardEv Спасибо, не знаю, почему я написал Link вместо Linq! –

Смежные вопросы