C# 如何根据结构中的几个参数之一进行排序

C# 如何根据结构中的几个参数之一进行排序,c#,C#,我试图做的是按照最后一个参数(Niva)中输入的顺序对每个结构(Säljare1-Säljare6)进行排序,因此如果Salesman1和2(Säljare1和2)已经达到100个样本的Niva(级别)销售额,那么Säljare1和2的统计数据都将显示,后面是“这么多的销售人员已经达到Niva 2” 那么,我如何指导程序根据参数Niva选择排序呢 public struct Säljare6 { public String Namn; public String Personnu

我试图做的是按照最后一个参数(Niva)中输入的顺序对每个结构(Säljare1-Säljare6)进行排序,因此如果Salesman1和2(Säljare1和2)已经达到100个样本的Niva(级别)销售额,那么Säljare1和2的统计数据都将显示,后面是“这么多的销售人员已经达到Niva 2”

那么,我如何指导程序根据参数Niva选择排序呢

public struct Säljare6
{
    public String Namn;
    public String Personnummer;
    private String Distrikt;
    private int AntalArtiklar;
    private int Niva;



    public string NAMN
    {
        get { return Namn; }
        set { Namn = value; }
    }
    public string PERSONNUMMER
    {
        get { return this.Personnummer; }
        set { this.Personnummer = value; }
    }
    public String DISTRIKT
    {
        get { return Distrikt; }
        set { Distrikt = value; }
    }
    public int ANTALARTIKLAR
    {
        get { return AntalArtiklar; }
        set { AntalArtiklar = value; }
    }
    public int NIVA
    {
        get { return Niva; }
        set { Niva = value; }
    }

    public Säljare6(string Namn6, string Personnummer6, string Distrikt6, int AntalArtiklar6, int Niva6)
    {


        this.Namn = Namn6;
        this.Personnummer = Personnummer6;
        this.Distrikt = Distrikt6;
        this.AntalArtiklar = AntalArtiklar6;
        this.Niva = Niva6;
    }


    public void SkrivUtInfo()
    {

        Console.WriteLine("Namn = {0} && Personnummer = {1} && Distrikt = {2} && AntalArtiklar = {3} && Niva = {4}", this.Namn, this.Personnummer, this.Distrikt, this.AntalArtiklar, this.Niva);
    }
}



class Program
{

    static void Main(string[] args)
    {
        Console.WriteLine("Var Vänlig och skriv in info för säljaren (1,Namn (enter),2, persnr (enter),3, Distrikt(enter),4, AntalArtiklar (enter), 5,Niva 1-4(enter)");
        Säljare1 S1 = new Säljare1(Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()));
        Console.WriteLine("Var Vänlig och skriv in info för nästa säljare (1,Namn (enter), 2,persnr (enter), 3,Distrikt(enter), 4,AntalArtiklar (enter), 5,Niva 1-4(enter)");
        Säljare2 S2 = new Säljare2(Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()));
        Console.WriteLine("Var Vänlig och skriv in info för nästa säljare (1,Namn (enter), 2,persnr (enter), 3,Distrikt(enter), 4,AntalArtiklar (enter), 5,Niva 1-4(enter)");
        Säljare3 S3 = new Säljare3(Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()));
        Console.WriteLine("Var Vänlig och skriv in info för nästa säljare (1,Namn (enter), 2,persnr (enter), 3,Distrikt(enter), 4,AntalArtiklar (enter), 5,Niva 1-4(enter)");
        Säljare4 S4 = new Säljare4(Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()));
        Console.WriteLine("Var Vänlig och skriv in info för nästa säljare (1,Namn (enter), 2,persnr (enter), 3,Distrikt(enter), 4,AntalArtiklar (enter), 5,Niva 1-4(enter)");
        Säljare5 S5 = new Säljare5(Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()));
        Console.WriteLine("Var Vänlig och skriv in info för nästa säljare (1,Namn (enter), 2,persnr (enter), 3,Distrikt(enter), 4,AntalArtiklar (enter), 5,Niva 1-4(enter)");
        Säljare6 S6 = new Säljare6(Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()));

        S1.SkrivUtInfo();
        S2.SkrivUtInfo();
        S3.SkrivUtInfo();
        S4.SkrivUtInfo();
        S5.SkrivUtInfo();
        S6.SkrivUtInfo();      

正如其他人已经说过的,看起来您创建了相同结构的多个结构

下面是一个示例类,它实现了允许您使用的接口,例如,方法

试试看:

public void TestSort()
{
    var list = new List<MyObject>();
    list.Add(new MyObject("e", 1));
    list.Add(new MyObject("d", 4));
    list.Add(new MyObject("b", 2));
    list.Add(new MyObject("a", 1));
    list.Add(new MyObject("c", 3));
    list.Add(new MyObject("a", 4));

    Debug.WriteLine("unsorted");
    list.ForEach(obj => Debug.WriteLine(obj));
    list.Sort();
    Debug.WriteLine("sorted");
    list.ForEach(obj => Debug.WriteLine(obj));
}
public void TestSort()
{
var list=新列表();
增加(新的MyObject(“e”,1));
添加(新的MyObject(“d”,4));
添加(新的MyObject(“b”,2));
添加(新的MyObject(“a”,1));
添加(新的MyObject(“c”,3));
添加(新的MyObject(“a”,4));
Debug.WriteLine(“未排序”);
list.ForEach(obj=>Debug.WriteLine(obj));
list.Sort();
Debug.WriteLine(“排序”);
list.ForEach(obj=>Debug.WriteLine(obj));
}

从您的代码中可以看出,您为每个销售人员声明了一个单独的类。您不应该这样做,因为类描述/定义了一种类型的事物而不是一种特定的事物

下面的代码展示了两种方法,一种只使用for和foreach,另一种使用“LINQ”和lambdas(第一个示例),这对于初学者来说可能有点太高级了,但我认为它非常有用,即使是初学者也应该知道如何使用它

using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        List<Säljare> salesmen = new List<Säljare>();

        var nivaMax = 0;
        for (int i = 0; i < 6; i++)
        {
            Console.WriteLine("Var Vänlig och skriv in info för säljaren (1,Namn (enter),2, persnr (enter),3, Distrikt(enter),4, AntalArtiklar (enter), 5,Niva 1-4(enter)");
            var saljare = new Säljare(Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()));
            nivaMax = Math.Max(nivaMax , saljare.NIVA);
            salesmen.Add(saljare);
        }

        //We're telling the GroupBy method what we want to 'group by'
        //this is the 'LINQ' part.
        foreach (var nivaGruppe in salesmen.GroupBy(x => x.NIVA))
        {
            var groupNivå = nivaGruppe.Key;
            var howManyInGroup = nivaGruppe.Count();
            Console.WriteLine("{0} salesmen have reached nivå {1}", howManyInGroup, groupNivå);
        }

        Console.WriteLine("------------------------------------------");

        for (int level = 0; level < nivaMax; level++)
        {
            var salesmenAtLevel = 0;
            foreach (Säljare saljare in salesmen)
            {
                if (saljare.NIVA == level)
                {
                    salesmenAtLevel++;
                }
            }
            if (salesmenAtLevel > 0)
            {
                Console.WriteLine("{0} salesmen have reached nivå {1}", salesmenAtLevel, level);
            }
        }

        Console.ReadKey(true);
    }
}
另一种方式:

public int NIVA
{ 
    get
    {
        if( this.AntalArtiklar <= 49) return 1;
        if( this.AntalArtiklar <= 99) return 2;
        if( this.AntalArtiklar <= 199) return 3;
        if( this.AntalArtiklar >  199) return 4;
    }
}
public-int-NIVA
{ 
得到
{

如果(this.AntalArtiklar),则应为类而非结构。:“如果类型的实例是小的,通常是短命的或通常嵌入在其他对象中,则考虑定义结构而不是类。除非类型具有以下所有特性,否则不定义结构:它逻辑上表示一个单一值,类似于基元类型(整数、双等)。。它的实例大小小于16字节。它是不可变的。它不必频繁装箱。"
Säljare1
Säljare2
等是什么样子的?它们有什么共同点?从代码上看,它们将具有相同的结构,那么为什么它们是不同的类型呢?如果你想对对象进行排序,那么你想将它们放入某种集合中,例如
列表
。如果我改变了它他将结构转换成一个类,我能使用剩下的代码还是从头开始?Säljare1代表一个人,很抱歉,我在这方面是新手,并不真正理解我创建了几个Säljare结构,因为我认为这样可以相互比较。看起来您有6个销售人员,您定义了6个独立但相同的
struct
类型,每个预期实例一个。这与实际情况正好相反!对相同结构或对象的定义只执行一次,然后根据需要频繁使用,我们称之为实例化。想象一下您正在处理1000个使用这种方法的销售人员的数量…太可怕了!谢谢,但是如果我想有1=0-100销售的恒定水平,2=100-200销售。例如姓名:Roger Persnr:923452 Distrikt:Berlin Antal:200。然后一个销售人员达到了2级(200+)。使用数组最简单吗?我不太清楚“恒定”是什么意思级别。您的意思是销售数量应该定义销售人员所处的级别吗?在这种情况下,您不应该要求Niva的输入,而是在Niva属性的“get”部分进行计算。数组和列表是相似的。两者之间的重要区别在于,创建数组时数组的大小是固定的(现实世界的类比=书架,有些书架可能是“空的”),而列表可能会随着项目的添加/删除而增长或收缩(现实世界的类比=连环链接在一起的回形针,没有“空”的位置).Im试图使Niva属性在@kont123中获得值。我已经用我认为您正在尝试的方法更新了答案。它不起作用:/public int Niva(object obj){if(AntalArtiklar
public int NIVA
{
    get 
    { 
        return System.Math.Ceiling(AntalArtiklar / 100.0);
    }
}
public int NIVA
{ 
    get
    {
        if( this.AntalArtiklar <= 49) return 1;
        if( this.AntalArtiklar <= 99) return 2;
        if( this.AntalArtiklar <= 199) return 3;
        if( this.AntalArtiklar >  199) return 4;
    }
}