【问题标题】:Order list of entities which have lists by string length in inner list内部列表中按字符串长度列出的实体的顺序列表
【发布时间】:2021-10-02 09:24:18
【问题描述】:

有 2 个班级:

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<Question> Questions { get; set; }
}

public class Question
{
    public int Id { get; set; }
    public string Type { get; set; }
    public string Answer { get; set; }
}

一个由 X 名员工和每个员工都有的 4 个问题组成的列表,有没有办法通过问题答案对员工进行动态排序?就像我在我的反应应用程序中按“症状”表格中的升序排序按钮一样,它首先给我的员工对“症状”类型的问题给出“否”答案,然后是“是”,然后是“也许” ”。我无法弄清楚什么 LINQ 表达式甚至可以做到这一点。在我的脑海里,我有点想我应该怎么做,但我不能只写查询。

var list = new List<Employee>()
        {
            new Employee
            {
                Questions = new List<Question>()
                {
                    new Question() {Type = "Symptoms", Answer = "Yes"},
                    new Question() {Type = "Travel", Answer = "No"},
                    new Question() {Type = "Contact", Answer = "Maybe"},
                    new Question() {Type = "Test", Answer = "Yes"}
                }
            },
            new Employee
            {
                Questions = new List<Question>()
                {
                    new Question() {Type = "Symptoms", Answer = "Yes"},
                    new Question() {Type = "Travel", Answer = "No"},
                    new Question() {Type = "Contact", Answer = "Maybe"},
                    new Question() {Type = "Test", Answer = "Yes"}
                }
            },
            new Employee
            {
                Questions = new List<Question>()
                {
                    new Question() {Type = "Symptoms", Answer = "Yes"},
                    new Question() {Type = "Travel", Answer = "No"},
                    new Question() {Type = "Contact", Answer = "Maybe"},
                    new Question() {Type = "Test", Answer = "Yes"}
                }
            }
        };

朋友说我应该写一个比较器,但是这里我不太明白具体怎么用

【问题讨论】:

  • 能否让代码编译?
  • 使用OrderBy,您可以选择订购什么。

标签: c# list linq sorting


【解决方案1】:

您可以使用 LinQ 的表达式“OrderBy”。

在一个名为 listEmployees 的列表对象上,在列表顶部按 Answer == "No" 排序,代码如下所示:

        list = list.OrderByDescending(x => x.Questions.First(y => y.Type == "Symptoms").Answer == "No").ToList();

也许您的代码中不需要 ToList() 函数。

这是一个包含您的列表和类的代码 sn-p:

Code Snippet

public static void Main()
{
    var list = new List<Employee>()
    {
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "Yes"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "Yes"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "Yes"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "Yes"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "Yes"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "Yes"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "Yes"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "No"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "No"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "No"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        },
        new Employee
        {
            Questions = new List<Question>()
            {
                new Question() {Type = "Symptoms", Answer = "No"},
                new Question() {Type = "Travel", Answer = "No"},
                new Question() {Type = "Contact", Answer = "Maybe"},
                new Question() {Type = "Test", Answer = "Yes"}
            }
        }
    };
    Console.WriteLine("----------BEFORE ORDERBY---------");
    PrintEmployeeList(list);
    Console.WriteLine("---------------------------------\n\n");
    
    // You can change "Yes" to "No" if you want the "No" first.
    list = list.OrderByDescending(x => x.Questions.First(y => y.Type == "Symptoms").Answer == "No").ToList();
    
    Console.WriteLine("----------AFTER ORDERBY----------");
    PrintEmployeeList(list);
    Console.WriteLine("---------------------------------");
}

static void PrintEmployeeList(List<Employee> list)
{
    foreach(Employee employee in list)
    {
        Console.WriteLine(employee.Questions[0].Answer);
    }
}

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<Question> Questions { get; set; }
}

public class Question
{
    public int Id { get; set; }
    public string Type { get; set; }
    public string Answer { get; set; }
}

【讨论】:

  • 不要在未将关键内容放在答案中的情况下链接到外部网站。链接被破坏。我们不希望您的回答被破坏。
  • 效果很好,谢谢!没有使用First() 提出这个子查询,所以我不太明白它是如何工作的
  • @MixaKonan 您基本上可以只使用问题[0],因为所有员工问题中的第一个问题是症状的问题类型。使用 .First() 和条件 type == "Symptoms",您可以搜索与症状问题相关联的问题,并获得与该条件相关的第一个问题。例如,您不会在事故中得到旅行问题答案。
【解决方案2】:

1,您的“问题”类缺少“类型”属性。
但是在添加该属性代码后看起来没问题。 2,当你添加测试数据时,让它们变得更好。您的数据已经排序,因为所有问题都有相同的答案,即“是”。

我稍微编辑了你的测试数据:

var list = new List<Employee>()
            {
                new Employee
                {
                    FirstName = "John",
                    Questions = new List<Question>()
                    {
                        new Question() {Type = "Symptoms", Answer = "Yes"},
                        new Question() {Type = "Travel", Answer = "No"},
                        new Question() {Type = "Contact", Answer = "Maybe"},
                        new Question() {Type = "Test", Answer = "Yes"}
                    }
                },
                new Employee
                {
                    FirstName = "Emma",
                    Questions = new List<Question>()
                    {
                        new Question() {Type = "Symptoms", Answer = "Maybe"},
                        new Question() {Type = "Travel", Answer = "No"},
                        new Question() {Type = "Contact", Answer = "Maybe"},
                        new Question() {Type = "Test", Answer = "Yes"}
                    }
                },
                new Employee
                {
                    FirstName = "Bill",
                    Questions = new List<Question>()
                    {
                        new Question() {Type = "Symptoms", Answer = "No"},
                        new Question() {Type = "Travel", Answer = "No"},
                        new Question() {Type = "Contact", Answer = "Maybe"},
                        new Question() {Type = "Test", Answer = "Yes"}
                    }
                }
            };

之后我做了 lambda 表达式:

var orderedList = list.OrderByDescending(x => x.Questions.Where(q => q.Type == "Symptoms").FirstOrDefault().Answer
        switch
        {
            "No" => 3,
            "Yes" => 2,
            "Maybe" => 1,
            _ => 0
        }).ToList();

结果是:
在位置 1。是比尔
在位置 2。是约翰
位置 3. 是艾玛

如果我误解了你的问题,我很抱歉。

【讨论】:

  • 你可以摆脱Where:... x =&gt; x.Questions.FirstOrDefault(q =&gt; q.Type == "Symptoms")?.Answer ...。请注意?.:如果您输入FirstOrDefault,即您发现Default 部分是必要的,您应该准备好默认设置,即null,这就是为什么需要?. 而不是.
  • 不,你明白我的意思。我不确定项目中只会有 3 个答案,因此 switch 在这里不是一个好的选择,抱歉没有提供足够的信息。而且我什至不知道你可以这样使用 switch 。无论如何感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2020-06-28
  • 2020-09-25
  • 2021-09-19
  • 2013-05-14
  • 2018-10-27
  • 1970-01-01
相关资源
最近更新 更多