Вернуть новый объект LINQ - PullRequest
       8

Вернуть новый объект LINQ

0 голосов
/ 28 февраля 2019

Я хочу написать LINQ, который возвращает мне новый объект (string, int), содержащий:

  • string (имя позиции)
  • 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;
}

TestList имеет такие поля, как: Postion, PersonNR, City,Фамилия.Все поля string.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Путем изменения меньшего количества кода вы можете достичь желаемого результата, например,

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"
0 голосов
/ 28 февраля 2019

Вы, наверное, ищете Tuple.В случае C # 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); 
 }

В более старых версиях C # без имени один:

 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(...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...