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
}

非常感谢您的帮助。

编辑:

我有多个数据源,其中包括:

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

因此需要对新数组中的项目进行排序,我知道这不是很有效,但是无法以任何其他方式获取我需要的信息。

4

6 回答 6

3

您可以使用LINQ排序运算符OrderBy和对列表进行排序ThenBy,如下所示。

using System.Linq;

进而...

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

这将创建一个新的约会列表,按主题排序,然后按名称排序。

于 2013-10-03T08:01:05.210 回答
2

目前尚不清楚您的最终目标是什么,但是:

使用泛型List而不是数组:

有关为什么首选使用 a 的更多信息,请参阅此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`.
于 2013-10-03T07:57:23.617 回答
0

如果数据在概念上是一行多列,请考虑使用字典对象而不是数组。

foreach(KeyValuePair<string, string> entry in MyDic)
{
    // do something with entry.Value or entry.Key
}
于 2013-10-03T07:56:20.647 回答
0

您已经在 fpts 中有一个对象列表,对该列表本身进行排序:

fpts.OrderBy(x => x.Subject).ThenBy(x => x.Location).ToList();
于 2013-10-03T08:02:44.270 回答
0

LINQ 是您的朋友。

fapts似乎已经是一个集合,因此您可以对其进行操作。

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

我已经使用ToArray()调用来强制立即评估,这意味着 myNewArray 已经排序,因此如果您多次使用它,则不必重新评估排序。

或者,如果您只使用它一次,那么您很容易错过 ToArray() 部分,然后排序的执行将被推迟,直到您尝试通过 myNewArray 枚举。

此解决方案将源对象放入数组中,但如果您只想存储您提到的特定字段,那么您将需要使用选择。对于数组项类型,您有两种选择,您可以使用匿名类,如果您从函数返回此数组或定义类,则该类会带来困难。

对于匿名:

 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();
于 2013-10-03T08:08:03.763 回答
-1

您有多种选择。最常见的两种是:

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

享受

(因为我无法评论和回复评论 - 不清楚他是否有课等,或者只是向我们展示他想做什么。我认为这只是为了演示目的,因为没有关于如何读取数据的任何信息。如果他已经可以将它放入一个类中,那么无论如何都会应用第一个答案。我只是把最后两个扔在那里,因为它们是首先获取数据的选项。)

于 2013-10-03T07:56:38.570 回答