【问题标题】:How to synchronize the sorting of three arrayLists如何同步三个arrayList的排序
【发布时间】:2012-02-24 03:44:20
【问题描述】:

我制作了一个程序,用户可以在其中输入任意数量的名字,包括名字、中间名首字母(可选)和姓氏格式。然后,我拆分名称并将它们分配给名为 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();
    }
}

【问题讨论】:

  • 这是作业吗?否则没有实际理由保留单独的列表。
  • 而且没有理由使用ArrayList。请改用List<string>
  • 我会研究的。书中提到了它,但仅此而已。

标签: c#


【解决方案1】:

使用单个列表而不是 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);
}

【讨论】:

    【解决方案2】:

    不要使用 3 个列表。使用 1 个列表,其元素包含名字、中间名和姓氏并实现 IComparable,因此对姓氏 first 进行排序(并且 then 按 first 可能是中间名称)。

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

    您可以根据需要轻松将此列表拆分为 3 个列表,排序之后。

    【讨论】:

    • 我不一定需要 3 个列表。我列出了三个列表,因为我不知道如何将名字、中间名首字母(可选)、姓氏字符串转换为姓氏、名字、中间名首字母字符串。我会更多地研究它。
    【解决方案3】:

    创建一个类UserName包含3个字段:fName、mName、lName。 公共类用户名 { 公共字符串 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 上调用排序:

      IComparer compareByFName = new sortByFNameHelper(); usernames.sort(compareByFName);

    HTH。

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2016-08-05
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多