Если мы выполним следующие (благодаря @octavioccl за помощью) запросов LINQ:Найти Струны с некоторым Хэммингом расстоянием LINQ
var result = stringsList
.GroupBy(s => s)
.Where(g => g.Count() > 1)
.OrderByDescending(g => g.Count())
.Select(g => g.Key);
Это дает нам все строки, которые имеют место в списке по крайней мере дважды (но точно совпадают, т. е. расстояние Хэмминга = 0).
мне было просто интересно, если есть элегантное решение (все решения я пытался до сих пор либо петли использования и счетчик, который является уродливым или регулярное выражение) возможно, где мы можем указать расстояние Хэмминга в п Where
чтобы получить эти строки, которые лежат в пределах указанного диапазона расстояния Хэмминга?
P.S: Все строки имеют одинаковую длину
UPDATE
Действительно, благодаря krontogiannis за подробный ответ. Как я упоминал ранее, я хочу получить список строк с расстоянием от помех ниже заданного порога. Его код работает отлично для него (Еще раз спасибо).
Единственное оставшееся это взять строки из «результирующем» и вставить/добавить в `List»
В основном это то, что я хочу:
List<string> outputList = new List<string>();
foreach (string str in patternsList)
{
var rs = wordsList
.GroupBy(w => hamming(w, str))
.Where(h => h.Key <= hammingThreshold)
.OrderByDescending(h => h.Key)
.Select(h => h.Count());
outputList.Add(rs); //I know it won't work but just to show what is needed
}
Благодаря
Хэмминга расстояние применим к строкам равной длины. Все ли строки одинаковой длины? –
Если у вас есть строки A, B и C, а A - 1 вдали от B, а B - 1 от C, но A находится на расстоянии более 1 от C, как вы хотите их сгруппировать? то есть. если они были номерами, и вы хотите сгруппировать все номера, которые не превышают 1, и у вас есть номера 1, 2 и 3, какую группу (группы) вы хотели бы создать из этого? –
@ LasseV.Karlsen Хорошая точка Лассе. Кронто отлично справился с этим ответом –