我是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
}
因此需要对新数组中的项进行排序,我知道这不是很有效但是没有办法以任何其他方式获取我需要的信息。
答案 0 :(得分: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 :(得分:2)
目前还不清楚你的最终目标是什么,但是:
使用通用List
代替数组:
有关为何首选使用List
的详细信息,请参阅此SO question。
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`.
答案 2 :(得分:0)
如果数据在概念上是一行多列,则考虑使用Dictionary对象而不是数组。
foreach(KeyValuePair<string, string> entry in MyDic)
{
// do something with entry.Value or entry.Key
}
答案 3 :(得分:0)
你已经在fpts中有一个对象列表,对列表本身进行排序:
fpts.OrderBy(x => x.Subject).ThenBy(x => x.Location).ToList();
答案 4 :(得分: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();
对于命名类,假设class为MyClass
:
var myNewArray = fapts.OrderBy(Appoint => Appoint.Start)
.Select(Appoint => new MyClass {
Start = Appoint.Start,
Organiser = Appoint.Organiser.Name.ToString(),
Location = Appoint.Location
}).ToArray();
答案 5 :(得分:-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);
}
}
享受
(因为我无法发表评论并回复评论 - 目前尚不清楚他是否有课程等,或者只是向我们展示他想做什么。我认为这只是为了示范目的,因为那里没有任何关于如何读取数据的信息。如果他已经可以把它放到一个类中,而不是第一个应用的答案。我只是扔了那里的最后2个,因为它们是获取数据的选项。)