2013-05-26 7 views
2

У меня естьОпределение исходных точек точек накопления

var mostFrequentlyUsedEntriesOfList = inputList.GroupBy(word => word) 
         .Select(wordGroup => new { Word = wordGroup.Key, Frequency = wordGroup.Count() }) 
         .OrderByDescending(word => word.Frequency); 

который создает объекты, имеющие ключ и частота.

Что мне нужно добавить в mostFrequentlyUsedEntriesOfList, чтобы также иметь отправные точки точек накопления? То, что я имею в виду следующее:

Пример inputList:

a 
a 
b 
b 
a 
a 
b 
b 
a 
b 
b 
b 
b 
b 
a 

приведет ли

b 9 
a 6 

Начальная точка точек накопления будет (считая первый элемент, как 1)

b 10 

Таким образом, начальная точка появления b находится в позиции 10.

Итого:

Word frequency position 
b 9 10 
a 6 1 

Примечание: а начинается на 1 и 5 с той же частотой, так что выбрать первый из той же самой частоте.

Если что-то встречающийся только один раз, то это точка накопления, например, если был один с самого начала:

c 1 1 

Что я должен добавить к mostFrequentlyUsedEntriesOfList, также имеют начальную точки накопления баллов?

+0

Непонятно, что вы имеете в виду под «точками накопления». Я не понимаю, как '10' относится к' b', поскольку это точка накопления. –

+0

Кто-нибудь еще не понимает этого? –

+0

Пришлось прочитать его несколько раз, но я понимаю это сейчас ... получите начальную точку ** 1 на самой длинной последовательности каждой буквы **. Таким образом, для 'b' самая длинная последовательность работает 5 и начинается с позиции' 10'. Для 'a' самая длинная работающая последовательность равна 2 и есть 2 вхождения, поэтому просто возьмите первое, которое находится в позиции' 1'. – davmos

ответ

1
var mostFrequentlyUsedEntriesOfList = inputList 
    .GroupBy(word => word) 
    .Select(wordGroup => new 
    { 
     Word = wordGroup.Key, 
     Frequency = wordGroup.Count(), 
     Position = Enumerable.Range(0, inputList.Count()) 
      .OrderByDescending(index => inputList.Skip(index).TakeWhile(current => current == wordGroup.Key).Count()) 
      .First() + 1 
    }) 
    .OrderByDescending(word => word.Frequency); 

Это находит самые длинные пробеги перебирает все индексы, видя, как долго последовательность бежит оттуда, и выбрать индекс, где она максимальна.

+0

Он должен выбрать индекс, где начинается накопление, а не где оно максимальное. –

+0

Наверное, я должен был сформулировать это лучше. Он не выбирает максимальный индекс, а индекс, где начинается самая длинная последовательность с заданными элементами, так же, как давмос описал это в комментариях к вашему вопросу. – ggPeti

+0

@PeakReconstructionWavelength Можете ли вы, наконец, принять этот ответ, он явно делает то, что вы просили, и вы, очевидно, даже не пытались его запустить. – ggPeti

Смежные вопросы