Получить данные «как можно менее распространенными» из коллекции - PullRequest
2 голосов
/ 15 мая 2011

Начиная с такой таблицы:

| Code | Year |
---------------
| A01  | 2001 |
| A01  | 2002 |
| B01  | 2002 |
| C01  | 2003 |

Я должен прийти к этому:

| Code | Year |
---------------
| A01  | 2001 |
| B01  | 2002 |
| C01  | 2003 |

Я должен сгруппировать первый столбец (код) и второй (Год) Я должен получить данные «как можно менее распространенными» по сравнению со всеми другими записями.Я пытаюсь объяснить это на примере: для кода «A01» у меня есть 2 года: «2001» и «2002».Я должен взять '2001', потому что это тот, который не повторяется в других записях.В случае, если нет доступных значений 'Year', которые не повторяются в других записях, хорошо бы принять любое значение.

Данные находятся в виде массива в памяти и взаимодействуют с ними. IЯ использую некоторые запросы LINQ.

Заранее спасибо!Pileggi

Ответы [ 4 ]

2 голосов
/ 15 мая 2011

Я прошу прощения за это в C #. Надеюсь, у вас не возникнет проблем с конвертацией в VB.NET.

var filteredItems = items
    .Select(cod => cod.Code).Distinct()
    .Select(cod => items.OrderBy(itm => itm.Year).First(itm => itm.Code == cod))
    .ToList();

Тестовый код:

public class Item
{
    public string Code { get; set; }

    public string Year { get; set; }
}

public static void Main(string[] args)
{
    var items =
        new List<Item>
        {
            new Item{ Code = "A01", Year = "2001" },
            new Item{ Code = "A01", Year = "2002" },
            new Item{ Code = "B01", Year = "2002" },
            new Item{ Code = "C01", Year = "2003" },
        };

    var filteredItems = items
        .Select(cod => cod.Code).Distinct()
        .Select(cod => items.OrderBy(itm => itm.Year).First(itm => itm.Code == cod))
        .ToList();
}
1 голос
/ 19 мая 2011

Вот правильный ответ (для сравнения с ответом Алекса Азы: FilterItemsAlexAza и FilterItemsSsithra дают разные результаты, поскольку менее распространенные данные больше не являются минимальными - здесь 2005 вместо 2001 для A01)

class Program
{
    public static void Main(string[] args)
    {
        var items = new List<Item>
        {
            new Item { Code = "A01", Year = "2005" },
            new Item { Code = "A01", Year = "2002" },
            new Item { Code = "B01", Year = "2002" },
            new Item { Code = "C01", Year = "2003" },
        };

        var filteredItemsAlexAza = items.Select(cod => cod.Code).Distinct().Select(cod => items.OrderBy(itm => itm.Year).First(itm => itm.Code == cod)).ToList();
        var filteredItemsSsithra = items
            .Select(item => new { Item = item, NbItemsWithSameYear = items.Where(i => i.Year == item.Year).Count() })
            .GroupBy(ano => ano.Item.Code)
            .Select(group => group.OrderBy(ano => ano.NbItemsWithSameYear).First().Item)
            .ToList();
    }

    public class Item
    {
        public string Code { get; set; }
        public string Year { get; set; }
    }
}
0 голосов
/ 19 мая 2011

Извините, но предлагаемое решение абсолютно не соответствует начальным требованиям Pileggi. «Менее распространенное значение, насколько это возможно» стало «минимальным значением». Оба совпадают в этом конкретном случае, что создает иллюзию того, что ответ Алекса Азы правильный, но это просто совпадение.

0 голосов
/ 15 мая 2011

Вы можете поискать "Исходный код соответствия" на предпочитаемом вами языке реализации.

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