Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#/WPF中的If条件内调用LINQ查询_C#_Wpf_Linq - Fatal编程技术网

在C#/WPF中的If条件内调用LINQ查询

在C#/WPF中的If条件内调用LINQ查询,c#,wpf,linq,C#,Wpf,Linq,这个问题是我在这里提出的问题的延续: 多亏了这里的人们的大力帮助,我才得以获得以下成果 +--------+-------+---------+------+ | Name | Score | Average | Star | +--------+-------+---------+------+ | John | 15 | 5 | 3 | | Hannah | 13 | 4.3 | 1 | | Lilly | 13 | 4.

这个问题是我在这里提出的问题的延续:

多亏了这里的人们的大力帮助,我才得以获得以下成果

+--------+-------+---------+------+
|  Name  | Score | Average | Star |
+--------+-------+---------+------+
| John   |    15 |       5 |    3 |
| Hannah |    13 |     4.3 |    1 |
| Lilly  |    13 |     4.3 |    2 |
+--------+-------+---------+------+
所以我想知道是否有可能得到下面的输出

+--------+-------+---------+------+------+
|  Name  | Score | Average | Star |Letter|
+--------+-------+---------+------+------+
| John   |    15 |       5 |    3 |    A |
| Hannah |    13 |     4.3 |    1 |    C |
| Lilly  |    13 |     4.3 |    2 |    B |
+--------+-------+---------+------+------+
基本上,对于3星,字母应该是A,对于2,B,对于1,C。我认为使用if语句很容易做到这一点,但它不起作用

这是我的密码:

public string Name { get; private set; }
public int Score { get; set; }
public decimal Average { get; set; }
public decimal Count { get; set; }
public int Star { get; set; }

public Person(string name, int score, decimal avg, int count, int star)
{
    Name = name;
    Score = score;
    Average = avg;
    Count = count;
    Star = star; 
}
public ObservableCollection<Person> Persons { get; set; }
filepath = scoresFile; 

public MainWindow()
{
    InitializeComponent();
    LoadTable();
}

private void datagrid_Sorting(object sender, DataGridSortingEventArgs e)
{
    if (e.Column.Header.Equals("Name") || e.Column.Header.Equals("Score"))
    {
        e.Handled = true;
    }
}

public void LoadTable()
{
    var lines = File.ReadAllLines(filepath);
    Persons = new ObservableCollection<Person>();
    var data = lines.Select(line =>
    {
    var column = line.Split(',');
    int c = column[1].Count(); 
    var name = column[1];
    int score = int.Parse(column[3]);
    decimal avg = decimal.Parse(column[3]);
    int count = 0; 
    int star = 0; 
    char letter;
    return new { name, score, avg, count, star};
    });

    var groupedData = data.GroupBy(p => p.name)
        .Select((g, i) => new { 
                num= 0, name = g.Key, 
                score = g.Sum(p => p.score), 
                avg = decimal.Round(g.Average(p => p.avg), 1), 
                star = g.Count(p => p.score == 5) })
        .OrderByDescending(x => x.avg);

        if (groupedData.Where(u => u.star == 3 ))
        {
          letter = "A"
        }
        else if (groupedData.Where(u => u.star == 2 ))
        {
         letter = "B"
        }
        else
        {
          letter = "C"
        }

    var persons = groupedData.Select((p, i) => new Person(i + 1, p.name, p.score, p.avg, p.count, p.star));

    foreach (var person in persons)
    {
        Persons.Add(person);
    }

    datagrid.ItemsSource = Persons; 
}

知道我做错了什么吗?也许我没有在if语句中正确调用LINQ查询

使用以下代码更新您的
groupedData
LINQ语句:

var groupedData = data.GroupBy(p => p.name)
                            .Select((g, i) => new {
                                num = 0,
                                name = g.Key,
                                score = g.Sum(p => p.score),
                                avg = decimal.Round(g.Average(p => p.avg), 1),
                                star = g.Count(p => p.score == 5),
                                letter = g.Count(p => p.score == 5) == 3 ? "A" : (g.Count(p => p.score == 5) == 2 ? "B" : (g.Count(p => p.score == 5) == 1 ? "C" : ""))
                            })
                            .OrderByDescending(x => x.avg);

将“Where”更改为“Any”@eocron将其更改为Any清除了我得到的错误,但我仍然无法使该列显示最后一列中的字符字母。你知道这是实现这一目标的最佳方法吗?谢谢。如果你觉得这个答案解决了你的问题。请接受。谢谢!
var groupedData = data.GroupBy(p => p.name)
                            .Select((g, i) => new {
                                num = 0,
                                name = g.Key,
                                score = g.Sum(p => p.score),
                                avg = decimal.Round(g.Average(p => p.avg), 1),
                                star = g.Count(p => p.score == 5),
                                letter = g.Count(p => p.score == 5) == 3 ? "A" : (g.Count(p => p.score == 5) == 2 ? "B" : (g.Count(p => p.score == 5) == 1 ? "C" : ""))
                            })
                            .OrderByDescending(x => x.avg);