Используйте LINQ для конкатенации нескольких строк в одну строку (свойство CSV)

Проблема в массиве. У вас есть нулевое или пустое значение в полях, соответствующих 'id' и 'pname'. Во-первых, вам не следует помещать их в массив, но если вы не можете помочь, тогда сделайте нулевую проверку внутри цикла, чтобы пропустить этот элемент.

Вот фрагмент кода с небольшим рефакторингом, чтобы прояснить, что он делает, поскольку единственным отличием был дополнительный пробел для последнего элемента.

<?php
  if(count($catArr['details'][$id]) > 0){

      $ik=1;
      $count = count($catArr['details'][$id]);
      $space = '';

      foreach($catArr['details'][$id] as $pv => $pArr){

          if($ik == $count){
              $space = ' ';
          }

          if($pArr['id'] != null && $pArr['pname'] != null){
            echo '<a class="set_color2 linehigh4 w_600 s_1-3" href="/products.php?pid='.$pArr['pid'].'&cid='.$pArr['cid'].'&p_id='.$pArr['id'].'">'.$pArr['pname'] . $space . '</a>'; 
          }

          $ik++;
      }
  }
?>
16
задан ekad 23 April 2017 в 03:05
поделиться

4 ответа

Это - оператор GroupBy. Вы используете LINQ для Объектов?

Вот пример:

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

public class Test
{
    static void Main()
    {
        var users = new[]
        {
            new { User="Bob", Hobby="Football" },
            new { User="Bob", Hobby="Golf" },
            new { User="Bob", Hobby="Tennis" },
            new { User="Sue", Hobby="Sleeping" },
            new { User="Sue", Hobby="Drinking" },
        };

        var groupedUsers = users.GroupBy(user => user.User);

        foreach (var group in groupedUsers)
        {
            Console.WriteLine("{0}: ", group.Key);
            foreach (var entry in group)
            {
                Console.WriteLine("  {0}", entry.Hobby);
            }
        }
    }
}

Это делает группировку - можно ли управлять остальными сами?

17
ответ дан 30 November 2019 в 17:28
поделиться

Посмотрите, помогает ли это решение Вам:

List<User> users = new List<User>() 
{ 
    new User {Name = "Bob", Hobby = "Football" },
    new User {Name = "Bob", Hobby = "Golf"},
    new User {Name = "Bob", Hobby = "Tennis"},
    new User {Name = "Sue", Hobby = "Sleeping"},
    new User {Name = "Sue", Hobby = "Drinking"}
};

var groupedUsers = from u in users
         group u by u.Name into g
         select new
         {
             Name = g.First<User>().Name,
             Hobby = g.Select(u => u.Hobby)
         };


foreach (var user in groupedUsers)
{
    Console.WriteLine("Name: {0}", user.Name);
    foreach (var hobby in user.Hobby)
    {
        Console.WriteLine("Hobby: {0}", hobby);
    }
}
5
ответ дан 30 November 2019 в 17:28
поделиться

ре _concat аспект Вашего вопроса, с помощью:

static class EnumerableExtensions 
{  
    public static String AsJoined( this IEnumerable<String> enumerable )
    {
        return AsJoined( enumerable, "," );
    }

    public static String AsJoined( this IEnumerable<String> enumerable, String separator )
    {
        return String.Join( separator, enumerable.ToArray() );
    }
}

Вывод foreach в ответах bruno конусовидного и Jon Skeet может стать:

Console.WriteLine( "User:\tHobbies");
foreach ( var group in groupedUsers )
    Console.WriteLine( "{0}:\t{1}", group.Key, group.Select( g => g.Hobby ).AsJoined( ", " ) );

... и Вы получите точный выходной формат результата, который Вы попросили (да, я знаю, что другие уже решили Вашу проблему, но его твердое для сопротивления!)

5
ответ дан 30 November 2019 в 17:28
поделиться

Сделать это в одном Операторе Linq. Нет никакого способа, которым я рекомендовал бы код, но он показывает, что мог быть сделан.

            var groupedUsers = from user in users
                           group user by user.User into userGroup
                           select new
                           {
                               User = userGroup.Key,
                               userHobies =
                                   userGroup.Aggregate((a, b) => 
                                       new { User = a.User, Hobby = (a.Hobby + ", " + b.Hobby) }).Hobby
                           }
                            ;
        foreach (var x in groupedUsers)
        {
            Debug.WriteLine(String.Format("{0} {1}", x.User, x.userHobies));
        }
2
ответ дан 30 November 2019 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: