如何同步三个arrayList的排序
本文关键字:三个 arrayList 排序 同步 何同步 | 更新日期: 2023-09-27 18:25:50
我制作了一个程序,用户可以按照名字、中间首字母(可选)和姓氏格式输入任意多个名字。然后,我将这些名称拆分,并将它们分配给名为firstName、middleInitial和lastName的字符串变量。由于可能有多个名称输入,我将每个变量添加到其自己的名为fName、mI和lName的arrayList中。现在我必须对它们进行排序,使它们按姓氏升序排列。这就是问题的症结所在。对姓氏排序很容易,但如何使mI和fName arrayList按与lName arrayList相同的顺序排序?这是我的代码:
static void Main(string[] args)
{
ArrayList fName = new ArrayList();
ArrayList mI = new ArrayList();
ArrayList lName = new ArrayList();
Console.WriteLine("Please enter name: " + "(type quit to exit)");
string inValue = Console.ReadLine(); //prime Readline
while (inValue != "quit")
{
string firstName = "",
middleInitial = "",
lastName = "";
string[] name = inValue.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
firstName = name[0];
fName.Add(firstName);
if (name.Length > 2)
{
middleInitial = name[1];
mI.Add(middleInitial);
}
else
{
middleInitial = string.Empty;
mI.Add(middleInitial);
}
if (name.Length == 2)
{
lastName = name[1];
lName.Add(lastName);
}
else
{
lastName = string.Join(" ", name.Skip(2));
lName.Add(lastName);
}
Console.WriteLine("Please enter name: " + "(type quit to exit)");
inValue = Console.ReadLine();
}
}
使用单个列表而不是3。要做到这一点,您需要一个数据结构,将名字、中间名和姓氏封装到一个类中。
public class Name
{
public string First { get; set; }
public string Middle { get; set; }
public string Last { get; set; }
}
而不是使用ArrayList
,而是使用List<T>
。接下来使用LINQ为您进行排序。
var list = new List<Name>();
list.Add(new Name { First = "Brian", Middle = "D", Last = "Gideon" });
list.Add(new Name { First = "Bart", Middle = "", Last = "Simpson" });
list.Add(new Name { First = "Captain", Middle = "", Last = "America" });
var ordered = list.OrderBy(x => x.Last).ThenBy(x => x.First).ThenBy(x => x.Middle);
foreach (Name item in ordered)
{
Console.WriteLine(item.Last + ", " + item.First + " " + item.Middle);
}
不要使用3个列表。使用1个列表,其元素包含名字、中间名和姓氏,并实现IComparable
,以便按姓氏第一个进行排序(然后按名字和可能的中间名排序)。
或者,如果您提供适当的IComparer
到List.Sort
,则元素不需要实现IComparable
。
如果您愿意,您可以很容易地将此列表拆分为3个列表,排序后。
class Program
{
static void Main(string[] args)
{
List<Username> usernames = new ArrayList<Username>();
}
}
当用户输入名字、中间名、姓氏时,创建新的Username对象并将其存储到ArrayList中。
usernames.add(new Username {
fName = firstName,
mName = middleName,
lName = lastName}
);
要对此ArrayList进行排序,请执行以下操作:-创建要排序的IComparable对象(按fName或lName)。
public class sortByFNameHelper : IComparer
{
int IComparer.Compare(object a, object b)
{
UserName u1=(UserName)a;
UserName u2=(UserName)b;
if (u1.fName > u2.fName)
return 1;
if (u1.fName < u2.fName)
return -1;
else
return 0;
}
}
ArrayList上的调用排序:
IComparer compareByFName=new sortByFNameHelper();usernames.sort(compareByFName);
HTH。