如何同步三个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();
    }
}

如何同步三个arrayList的排序

使用单个列表而不是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,以便按姓氏第一个进行排序(然后按名字和可能的中间名排序)。

或者,如果您提供适当的IComparerList.Sort,则元素不需要实现IComparable

如果您愿意,您可以很容易地将此列表拆分为3个列表,排序后

创建类UserName包含3个字段:fName、mName、lName。公共类用户名{公共字符串fName,mName,lName;}将数据存储到1个ArrayList中,而不是存储到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。