Я хочу написать LINQ, который возвращает мне новый объект (строка, int), содержащий:
Вывод:
PositionA 8
PostionB 12
PostionC 13
Вот что у меня есть до сих пор:
public List<string, int> TestL() //or IEnumerable?
{
var q1 = TestList.GroupBy(s => s.Postion.ToUpper())
.Select(d =>
{
return new
{
NameDisplay = d.Key,
Count = d.Count(s => s.PersonNR)
};
})
.OrderBy(g => g.Key);
return q1;
}
список тестов имеет такие поля, как: Postion, PersonNR, City, LastName. Все поля string.
Звонить OrderBy(g => g.Key) после Select нельзя - групп больше нет. Заказать по NamedDisplay





Вы, наверное, ищете Tuple. В случае С# 7.3+ вы можете попробовать использовать именованные кортежи:
https://docs.microsoft.com/en-us/dotnet/csharp/tuples
public IEnumerable<(string, int)> TestL() {
return TestList
.GroupBy(s => s.Postion.ToUpper())
.Select(chunk => (NameDisplay: d.Key, Count: d.Count()))
.OrderBy(item => item.NameDisplay);
}
В старых версиях С# безымянный один:
public IEnumerable<Tuple<string, int>> TestL() {
return TestList
.GroupBy(s => s.Postion.ToUpper())
.Select(chunk => Tuple.Create(d.Key, d.Count()))
.OrderBy(item => item.Item1);
}
Наконец, вы можете реализовать пользовательский класс:
public class MyClass {
public MyClass(string nameDisplay, int count) {
NameDisplay = nameDisplay;
Count = count;
}
public string NameDisplay {get; private set;}
public int Count {get; private set;}
}
...
public IEnumerable<MyClass> TestL() {
return TestList
.GroupBy(s => s.Postion.ToUpper())
.Select(chunk => new MyClass(d.Key, d.Count()))
.OrderBy(item => item.NameDisplay);
}
Если вы хотите вернуть не IEnumerable<T>, а List<T>, добавьте .ToList() после .OrderBy(...)
Изменяя меньше вашего кода, вы можете достичь желаемого результата, например,
public List<(string, int)> TestL() //or IEnumerable?
{
var q1 = TestList.GroupBy(s => s.Postion.ToUpper())
.Select(d =>
{
return new
{
NameDisplay = d.Key,
Count = d.Count()
};
})
.OrderBy(g => g.NameDisplay)
.Select(x => (x.NameDisplay, x.Count))
.ToList();
return q1;
}
Примечание: Убедитесь, что вы установили пакет NuGet ниже в своем проекте, иначе вы получите сообщение об ошибке для List<(string, int)> или IEnumerable<(string, int)>
Install-Package "System.ValueTuple"
@eh-sho : я получил ошибку - не могу преобразовать строку типа в bool (s.PersonNR)
О, только держи Count = d.Count() вместо Count = d.Count(s => s.PersonNR)
пожалуйста, обновите свой ответ, так как он может быть полезен для других, спасибо
Вероятно, вы ищете именованный кортеж (docs.microsoft.com/en-us/dotnet/csharp/tuples): у вас может быть не
List<string, int>(вList<T>Tозначает только один аргумент типа), аList<(string, int)>(здесь у нас есть кортеж из двух свойств)