如何同步三个arrayLists的排序

时间:2012-02-24 03:44:20

标签: c#

我创建了一个程序,用户在名字,中间名首字母(可选)和姓氏格式中输入尽可能多的名字。然后我拆分名称并将它们分配给名为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();
    }
}

3 个答案:

答案 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。