Corbin Spicer
Corbin Spicer

Reputation: 285

Arrays/Array Lists

I am fairly new to C#

I am trying to retrieve some information from an external data source and store it in array, once it is in an array I wish to sort it by time.

I know how to do this for just one column in a row, however the information I require has multiple columns.

For example:

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
}

Many thanks for your help.

EDIT:

I have multiple data sources which pull in this:

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

Hence the need to sort the items in a new array, I know this isn't very efficent but there is no way of getting the information I need in any other way.

Upvotes: 0

Views: 204

Answers (6)

Sam Leach
Sam Leach

Reputation: 12956

It's unclear what your final aim is but:

Use a generic List instead of an array:

See this SO question for more information as to why using a List is prefered.

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
}

If the aim of your code is to order by time, try the following:

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

Upvotes: 2

JustMeToo
JustMeToo

Reputation: 425

You have a wide range of options. The 2 most common are:

1) Create a class, then define an array or list of that class, and populate that

2) Create a structure that matches the data format and create an array or list of that

Of course, you could put the data into an XML format or dataset, but that's probably more work than you need.

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

Enjoy

(Since I can't comment and reply to the comment - it wasn't clear if he had a class, etc. or was just showing us what he wanted to do. I assumed it was just for demonstration purposes since there wasn't any info as to how the data was being read. If he could already put it into a class, than the first answer applied anyway. I just tossed the last 2 in there because they were options for getting the data first.)

Upvotes: -1

Bob Vale
Bob Vale

Reputation: 18474

LINQ is your friend here.

fapts appears to already be a collection so you could just operate on it.

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

I've used the ToArray() call to force immediate evaluation and means that myNewArray is already sorted so that if you use it more than once you don't have to re-evaluate the sort.

Alternatively if you are only using this once you can just as easily miss the ToArray() portion out and then execution of the sort will be deferred until you try and enumerate through myNewArray.

This solution puts the source objects into the array, but if you are just wanting to store the specific fields you mention then you will need to use a select. You have two choices for the array item type, you can either use an anonymous class which provides difficulties if you are returning this array from a function or define a class.

For anonymous:

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

For named class assuming class is MyClass:

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

Upvotes: 0

Richard Ev
Richard Ev

Reputation: 54087

You can sort a list using the LINQ sorting operators OrderBy and ThenBy, as shown below.

using System.Linq;

and then...

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

This will create a new list of appointments, sorted by subject and then by name.

Upvotes: 3

Abhitalks
Abhitalks

Reputation: 28387

You already have a list of objects in fpts, sort that list itself:

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

Upvotes: 0

Brian Ogden
Brian Ogden

Reputation: 19212

Consider a Dictionary Object instead of an array if the data is conceptually one row multiple columns.

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

Upvotes: 0

Related Questions