1 Востаннє редагувалося Betterthanyou (18.09.2019 11:38:48)

Тема: LINQ Вибрати унікальні поля по одному ключі, а інші поля вивести...

Є клас ErrDescriptionStructure

    class ErrDescriptionStructure
    {
        public string serverName;
        public string fileName;
        public string line;
        public string value;
    }

Для цього класу створюється лист і заповнюється

private List<ErrDescriptionStructure> errDescriptions = new List<ErrDescriptionStructure>();

Потрібно записати у string errDescriptionsString таке: value - унікальне і всі ін. значення полів (serverName, fileName, line) перерахувати через кому

Наприклад:
ErrDescriptionStructure має такі значення:
1) serverName = ser1, fileName = script1, line = 55, value = "Error 52"
2) serverName = ser1, fileName = script1, line = 123, value = "Error 52"
3) serverName = ser1, fileName = script1, line = 343, value = "Error 52"
4) serverName = ser1, fileName = script1, line = 8, value = "Error 182"

Тоді:

errDescriptionsString = 
"\n serverName  = ser1, ser1, ser1 | fileName = script1, script1, script1 | line = 55, 123, 343 | value = \"Error 52\"" + 
"\n serverName  = ser1 | fileName = script1 | line = 8 | value = \"Error 182\""

Це можна зробити за допомогою LINQ ? Як?

Прихований текст

Так можна вибрати всі унікальні поля за допомогою LINQ по ключі value, але я не знаю як перерахувати інші поля через кому

foreach (var item in errDescriptions.GroupBy(x => x.value).Select(x => x.First()))
            {
                errDescriptionsString += item.value + "\r\n";
            }

Ось те що я роблю без LINQ

            errDescriptions.Sort((x, y) => x.value.CompareTo(y.value));
                        
            string previousValue = errDescriptions[0].value;
            string serverNames = "";
            string fileNames = "";
            string lastLines = "";
            for (int i = 0; i <= errDescriptions.Count; i++)
            {
                if(i == errDescriptions.Count || previousValue != errDescriptions[i].value)
                {
                    errDescriptionsString +=
                        "<ServerName>" + serverNames + "</ServerName>" +
                        "<FileName>" + fileNames + "</FileName>" +
                        "<StringNumber>" + lastLines + "</StringNumber>" +
                        "<Value>" + previousValue + "</Value>" + "\r\n";
                    if (i == errDescriptions.Count)
                    {
                        break;
                    }
                    serverNames = fileNames = lastLines = "";
                    previousValue = errDescriptions[i].value;
                    
                }
                serverNames += errDescriptions[i].serverName + ", ";
                fileNames += errDescriptions[i].fileName + ", ";
                lastLines += errDescriptions[i].lastLine + ", ";
            }

2

Re: LINQ Вибрати унікальні поля по одному ключі, а інші поля вивести...

якось так


static void Main(string[] args)
        {
            var errDescriptions = new List<ErrDescriptionStructure>
            {
                new ErrDescriptionStructure { serverName = "ser1", fileName = "script1", line = "55", value = "Error 52"},
                new ErrDescriptionStructure { serverName = "ser1", fileName = "script1", line = "123", value = "Error 52"},
                new ErrDescriptionStructure { serverName = "ser1", fileName = "script1", line = "343", value = "Error 52"},
                new ErrDescriptionStructure { serverName = "ser1", fileName = "script1", line = "8", value = "Error 182"},
            };



            var result = string.Join(Environment.NewLine, errDescriptions
                .GroupBy(x => x.value).Select(x => "serverName = " + string.Join(", ", x.Select(xx => xx.serverName))
                   + " | fileName = " + string.Join(", ", x.Select(xx => xx.fileName))
                   + " | line = " + string.Join(", ", x.Select(xx => xx.line))
                   + " | value = \"" + x.Key + "\""));

            Console.WriteLine(result);
        }

не факт що це найшвидший варіант, просто перше що прийшло в голову.

Подякували: Betterthanyou1