我创建了一个程序,用户在名字,中间名首字母(可选)和姓氏格式中输入尽可能多的名字。然后我拆分名称并将它们分配给名为firstName,middleInitial和lastName的字符串变量。由于可能有多个名称输入,我已将每个变量添加到其自己的arrayList中,名为fName,mI和lName。现在我必须对它们进行排序,使它们按姓氏递增。这就是问题所在。可以很容易地对姓氏进行排序,但是如何让mI和fName arrayLists按照与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();
}
}
答案 0 :(得分:2)
使用单个列表而不是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);
}
答案 1 :(得分:1)
不要使用3个列表。使用1个列表,其元素包含名字,中间名和姓氏,并实现IComparable
,因此排序是在姓氏第一个(以及然后)的第一个和可能是中间名。)
或者,如果您向IComparable
提供适当的IComparer
,则元素无需实施List.Sort
。
如果需要,您可以轻松地将此列表拆分为3个列表, 后排序。
答案 2 :(得分:1)
创建一个类UserName包含3个字段:fName,mName,lName。 公共类UserName { public string fName,mName,lName; } 而不是将数据存储到3个数组中,而是将数据存储到1个ArrayList中。
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上调用sort:
IComparer compareByFName = new sortByFNameHelper(); usernames.sort(compareByFName);
HTH。