【发布时间】:2014-07-12 08:16:12
【问题描述】:
我有两个列表 - 来宾列表和 VIP 列表。我需要对访客列表进行排序,以便如果它包含 VIP 列表中的第一个人,他们会进入列表顶部,依此类推。 VIP 名单用完后,其余的客人名单仍保持原始顺序。排序必须同时使用名字和姓氏。我已经使用 List 和 foreach 语句完成了这项工作,但似乎应该有更优雅的方式。
有没有更简单、更现代的方法来做这种排序?
class Guest
{
public int NumberInParty { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class VIP
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
class TrackedGuest
{
public Guest guest;
public bool isTaken;
public TrackedGuest(Guest g)
{
this.guest = g;
isTaken = false;
}
}
static void Main(string[] args)
{
List<Guest> guests = new List<Guest>();
guests.Add(new Guest { FirstName = "Rob", LastName = "Carson", NumberInParty = 5 });
guests.Add(new Guest { FirstName = "George", LastName = "Waverly", NumberInParty = 3 });
guests.Add(new Guest { FirstName = "Pete", LastName = "Spacely", NumberInParty = 2 });
guests.Add(new Guest { FirstName = "George", LastName = "Jetson", NumberInParty = 6 });
guests.Add(new Guest { FirstName = "Cosmo", LastName = "Spacely", NumberInParty = 2 });
List<VIP> vips = new List<VIP>();
vips.Add(new VIP { FirstName = "George", LastName = "Jetson" });
vips.Add(new VIP { FirstName = "Cosmo", LastName = "Spacely" });
List<TrackedGuest> TrackedGuests = new List<TrackedGuest>();
foreach (Guest g in guests)
{
TrackedGuests.Add(new TrackedGuest(g));
}
List<Guest>SortedGuests = new List<Guest>();
// Copy each guest on the VIP list in order
foreach (VIP vip in vips)
{
foreach (TrackedGuest tGuest in TrackedGuests)
{
if (
(tGuest.isTaken == false) &&
(vip.FirstName == tGuest.guest.FirstName) &&
(vip.LastName == tGuest.guest.LastName)
)
{
SortedGuests.Add(tGuest.guest);
tGuest.isTaken = true;
}
}
}
// Process the rest of the guests
if (SortedGuests.Count < guests.Count)
{
foreach (TrackedGuest tGuest in TrackedGuests)
{
if (tGuest.isTaken == false)
{
SortedGuests.Add(tGuest.guest);
tGuest.isTaken = true;
}
}
}
foreach (Guest guest in SortedGuests)
{
Console.WriteLine(guest.FirstName + " " + guest.LastName + ": " + guest.NumberInParty + " in party.");
}
Console.ReadLine();
}
【问题讨论】:
-
它可能会建议您将其发布到 Code Review 而不是 Stack Overflow。前者旨在对此进行同行评审;一段有效的代码,但可能会被改进。
-
我有一段时间没写c#了,但我相信你可以使用一个哈希表作为VIP列表,并为你的Guest类使用一个值(可能称为VIP)来表明它是一个VIP。然后,当您构建您的访客列表时,在哈希表中查找名称,如果存在,请在您的访客类中设置值以指示它。然后,首先在 VIP 字段中对 Guest 类进行排序,并将名称作为辅助键。看起来这将是一种直接的方法,需要的代码要少得多。
-
试试 linq;参考这个:stackoverflow.com/questions/3945935/…