Выборка списка с помощью linq - PullRequest
4 голосов
/ 14 декабря 2010

Мне нужен вспомогательный метод для добавления меток осей к диаграмме. Я не хочу добавлять метку в каждой точке вдоль оси, которая имеет значения на диаграмме, потому что это будет слишком занятым. Поэтому мне нужно извлекать образцы через равные промежутки времени. До сих пор я придумал следующий метод, который отвечает требованиям, но я думаю, что должен быть более аккуратный способ сделать это с Linq. Кто-нибудь может подумать о том, как это можно сделать более кратким (n представляет общее количество выборок, которые я хочу вернуть)?

public static List<T> Sample<T>(this List<T> list, int n)
{
  var samples = new List<T>();
  var divisor = list.Count/n;
  for (var i = 0; i < list.Count; i++)
    if (samples.Count == i/divisor)
      samples.Add(list[i]);
  return samples;
}

Ответы [ 5 ]

5 голосов
/ 14 декабря 2010

Хм, а как же:

return Enumerable.Range(0,n).Select(i=>list[(i*list.Count)/(n-1)]);

Не то чтобы это действительно имело значение, но это дает вам немного лучшую сложность (O(n) вместо O(list.Count)

3 голосов
/ 14 декабря 2010

Если я правильно понимаю:

int divisor = list.Count / n;
return list.Where((val, index) => index % divisor == 0).ToList();
2 голосов
/ 14 декабря 2010
    public static List<T> Sample<T>(this List<T> list, int n)
    {
        Int32 count = list.Count;
        Int32 interval = count / n;

        return list.Where((item, index) => index % interval == 0).ToList();
    }
0 голосов
/ 05 марта 2014

В этом решении не используется деление в итерации, которое должно выполняться быстрее.

public static List<T> Sample<T>(this List<T> list, int n)
{
    return list.Sample(list.Count / n).ToList();
}

public static IEnumerable<T> Sample<T>(this IEnumerable<T> enumerable, int interval) {
    var index = 0;
    foreach (var item in enumerable) {
        if (index == 0) {
            yield return item;
        }
        if (++index == interval) index = 0;
    }
}
0 голосов
/ 14 декабря 2010

Попробуйте

list.Where((o, index) => index % divisor == 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...