Что я могу сделать, чтобы оптимизировать мой запрос linq? - PullRequest
0 голосов
/ 16 марта 2011

Я должен быть в состоянии отсортировать список объектов, который может содержать дублон с определенными критериями.Пока код работает, но для 50 000 строк в моем списке требуется 10 минут.

Вот код:

    public class TestObject
    {
        public string value1;
        public string value2;
        public string value3;
        public string value4;

        public int num1;
        public int num2;
    }

    public static List<TestObject> ReturnTestObjectListWithoutDoubloon(List<TestObject> source)
    {
        var destination = new List<TestObject>();
        var list = new Dictionary<int, TestObject>();


        while (source.Count > 0)
        {
            list.Clear();
            var originalElement = source[0];

            foreach (var query in source.Select((element, index) => new { Value = element, Index = index })
            .Where(currentElement => (currentElement.Value.value1 == originalElement.value1)
                                    && (currentElement.Value.value2 == originalElement.value2)
                                    && (currentElement.Value.value3 == originalElement.value3)
                                    && (currentElement.Value.value4 == originalElement.value4)))
            {
                list.Add(query.Index, query.Value);
            }

            if (list.Count > 1)
            {
                originalElement.num1 = list.Sum(a => a.Value.num1);
                originalElement.num2 = list.Sum(a => a.Value.num2);
            }

            destination.Add(originalElement);
            foreach (var positionToremove in list.Keys)
                source.RemoveAt(positionToremove);
        }

        return destination;
    }

Идея состоит в том, чтобы уменьшать список каждый раз, когда я передаюцикл while, так что мой запрос Linq выполняется в наименьшем возможном списке.Однако чем меньше у меня дублонов, тем медленнее.Я ищу решение, которое позволяет мне иметь наименьшее возможное количество рутним, память не является проблемой.

У кого-нибудь есть идея?

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Если я правильно понял ваш вопрос, у вас есть несколько элементов с одним и тем же ключом и вы хотите что-то сделать в этом случае. просто используйте выражение group by:

source.GroupBy(s => new
                    {
                      Value1 = s.Value1,
                      Value2 = s.Value2,
                      Value3 = s.Value3,
                      Value4 = s.value4
                    })
      .Select(g => new TestObject
                   {
                      Value1 = g.Key.Value1,
                      Value2 = g.Key.Value2,
                      Value3 = g.Key.Value3,
                      Value4 = g.Key.value4,
                      Num1 = g.Sum(s => s.Num1),
                      Num2 = g.Sum(s => s.Num2)
                   });
1 голос
/ 16 марта 2011

Я пытался выполнить ваш код до конца - и похоже, что вы просто пытаетесь удалить дубликаты из списка источников?

Если это так:

  • тогда я думаю, что ваш source.RemoveAt код может быть поврежден, поскольку он может удалить неправильные элементы.

  • тогда вы сможете выполнить одну операцию GroupBy () в этом списке источников - она ​​должна работать с использованием хеш-таблицы, которая должна быть намного быстрее, чем ваша существующая операция loop-inside-loops.

    var query = from s in source
                group s by new {
                    value1 = s.value1,
                    value2 = s.value2,
                    value3 = s.value3,
                    value4 = s.value4
                } into grouped
                select new TestObject()
                {
                    value1 = grouped.Key.value1,
                    value2 = grouped.Key.value2,
                    value3 = grouped.Key.value3,
                    value4 = grouped.Key.value4,
                    num1 = grouped.Sum(x => x.num1),
                    num2 = grouped.Sum(x => x.num2)
                };
    return query.ToList();
    
...