根据属性值对对象进行排序的问题

问题描述 投票:0回答:1

我坐在这里做一个我似乎无法弄清楚的学校项目;我要创建一个控制台应用程序,让用户为一家假设的公司输入一些销售人员。业务员的信息包括他们的姓名、地区和销售商品的数量。然后根据销售商品的数量将销售员分为不同的级别。最后,销售人员将被打印到控制台。打印应该一次完成一个级别,例如,如果两个销售人员达到一级,一个达到级别 2,控制台应该看起来像:

John Johnsson, someDistrict, 33件已售出 Mary Mara, someOtherDistrict, 40 件商品已售出 2名业务员达到1级

Judy Juggernut, anotherDistrict, 67件已售出 1名业务员达到2级

问题是印刷部分给我带来了麻烦。当用户输入信息时,将创建一个新的销售员类对象并将其存储在销售员数组中。然后检查每个销售员的销售商品数量,并为每个销售员分配一个级别。然后使用冒泡排序对数组进行排序,让销售人员在 salesmanArray[0] 上的销售额最少,依此类推。

在将结果打印到控制台之前一切正常。我试着为它写了一个方法:

    public static void sortering(Salesman[] salesmenArray)
    {
        Salesman[] level1 = new Salesman[salesmenArray.Length];
        Salesman[] level2 = new Salesman[salesmenArray.Length];
        Salesman[] level3 = new Salesman[salesmenArray.Length];
        Salesman[] level4 = new Salesman[salesmenArray.Length];

        for (int i = 0; i < salesmenArray.Length - 1; i++)
        {
            if (salesmenArray[i].level == 1)
            {
                level1[i] = salesmenArray[i];

            } else if (salesmenArray[i].level == 2)
            {
                level2[i] = salesmenArray[i];

            } else if (salesmenArray[i].level == 3)
            {
                level3[i] = salesmenArray[i];

            } else if (salesmenArray[i].level == 4)
            {
                level4[i] = salesmenArray[i];
            }
        }

        if (level1.Length != 0)
        {
            for (int i = 0; i < level1.Length - 1; i++)
            {
                Console.WriteLine("Name: " + level1[i].name);
                Console.WriteLine("District: " + level1[i].district);
                Console.WriteLine("Items sold: " + level1[i].itemsSold);
            }
            Console.WriteLine("" + (level1.Length - 1) + " sellers have reached level 1");
        }
            //Same thing for level 2, 3 and 4
    }

我想要做的是为不同级别创建 4 个新数组。然后我循环遍历包含所有销售人员的数组,并根据售出商品的数量将销售人员放入数组中。然后我检查级别数组是否为空。如果不是,我会遍历它们,打印出每个推销员的姓名、地区和售出的物品。最后还打印出每个级别有多少卖家。运行程序时,在线上报错

Console.WriteLine("Name: " + level1[i].name);

说“System.NullReferenceException 已被抛出”如果对象引用未设置为实例“。

我假设这意味着 level1[i].name 没有引用一个对象,但我真的不知道如何从那里开始......任何建议或指针都会非常有用!

c# arrays object nullreferenceexception
1个回答
0
投票

你得到一个 System.NullReferenceException 是因为你正在初始化与销售员数组长度相同的级别数组,但你只是根据他们的级别将销售员添加到级别数组。

因此级别数组中将没有初始化 null 元素,当您尝试访问 null 元素的 name 属性时,您会得到异常,因为您尝试读取不存在元素的属性。

要解决此问题,您可以使用 List<Salesman> 代替 Salesman[]List<T> 是一个通用的动态数组,你可以用同样的方式迭代它的项目:

public static void sortering(Salesman[] salesmenArray)
{
    var level1 = new List<Salesman>();
    var level2 = new List<Salesman>();
    var level3 = new List<Salesman>();
    var level4 = new List<Salesman>();

    for (int i = 0; i < salesmenArray.Length; i++)
    {
        if (salesmenArray[i].level == 1)
        {
            level1.Add(salesmenArray[i]);
        }
        else if (salesmenArray[i].level == 2)
        {
            level2.Add(salesmenArray[i]);
        }
        else if (salesmenArray[i].level == 3)
        {
            level3.Add(salesmenArray[i]);
        }
        else if (salesmenArray[i].level == 4)
        {
            level4.Add(salesmenArray[i]);
        }
    }

    if (level1Count > 0)
    {
        for (int i = 0; i < level1.Count; i++)
        {
            Console.WriteLine("Name: " + level1[i].name);
            Console.WriteLine("District: " + level1[i].district);
            Console.WriteLine("Items sold: " + level1[i].itemsSold);
        }
        Console.WriteLine("" + level1Count + " sellers have reached level 1");
    }
    //Same thing for level 2, 3 and 4
}

这里有一些其他的改进,然后你可以用你的代码来做。例如,如果 Salesman.level 可能仅包含列表 [1, 2, 3, 4] 中的值,您可以将级别存储在 ListList<Salesman>List<Salesman> 的数组中,并以更简单的方式添加项目:

// here we creates a new array of lists and initialize it with 4 empty lists of Salesman
var levels = new List<Salesman>[] 
{
    new List<Salesman>(),
    new List<Salesman>(),
    new List<Salesman>(),
    new List<Salesman>()
};

foreach(var salesmen in salesmenArray)
{
    // (salesmen.level - 1)-th list stores salesmen with that level
    levels[salesmen.level - 1].Add(salesmen);
}

// you can iterate salesmen of all levels with nested loops 
for(int level = 0; level < levels.Lenth; level++)
{
    foreach(Var salesman in levels[level])
    {
        Console.WriteLine($"Name: {salesman.name}");
        Console.WriteLine($"District: {salesman.district}");
        Console.WriteLine($"Items sold: {salesman.itemsSold}");
    }

    // Count property gets the number of elements contained in the List<T> so you don't need to decrement this value for display the number of salesmen with this level 
    Console.WriteLine($"{levels[level].Count} sellers have reached level {level + 1}");
}
© www.soinside.com 2019 - 2024. All rights reserved.