Mam listę, którą chcę pogrupować według właściwości A. Następnie wybierz wszystkie elementy dla tej grupy, w której klucz GroupBy ma wartość null lub „”, a następnie chcę zwrócić wszystkie elementy dla tych grup. Inaczej, ...

3
Big Smile 22 czerwiec 2021, 20:25

3 odpowiedzi

Najlepsza odpowiedź

Coś takiego:

 var result = list
   .GroupBy(item => item.A)
   .SelectMany(group => string.IsNullOrEmpty(group.Key)
      ? group as IEnumerable<ABC>
      : new ABC[] {group.First()})
   .ToList();

Sztuczka polega na tym, że powinniśmy zwrócić collection: albo całą grupę, albo kolekcję (tablicę) zawierającą tylko element First.

Możesz pozbyć się grupowania i spłaszczyć, aby uzyskać szybszą wersję, która jednak wykorzystuje efekt uboczny:

 HashSet<string> uniqueA = new HashSet<string>(); 

 var result = list
   .Where(item => string.IsNullOrEmpty(item.A) || uniqueA.Add(item.A))
   .ToList(); 
3
Dmitry Bychenko 22 czerwiec 2021, 18:10
var result = list.GroupBy(x => x.A)
                .Select(g =>
                    new
                    {
                        Key = g.Key,
                        Values = string.IsNullOrEmpty(g.Key) ? g.ToList() : new List<ABC> {g.FirstOrDefault()}
                    })
                .ToList();
1
godot 22 czerwiec 2021, 17:47

Czy musisz używać LINQ? Odpowiedź @pwilcoxa jest w porządku, ale może się okazać, że coś takiego jest bardziej czytelne:

var newList = new List<ABC>();
var setOfA = new HashSet<string>();
        
foreach (var abc in list)
{
    if (string.IsNullOrEmpty(abc.A))
    {
        newList.Add(abc);
    }
    else
    {
        if (setOfA.Contains(abc.A))
        {
            continue;
        }

        setOfA.Add(abc.A);
        newList.Add(abc);
    }
}
1
Neil T 22 czerwiec 2021, 17:48