Я хочу удалить запись edgeData из edgeList, когда общий источник данных меньше или равен linkCount.
Я думаю, что вы хотите, чтобы в конечном результате только те элементы из вашего входная последовательность со значением свойства Source
, которое встречается в вашей последовательности больше раз, чем linkCount
.
Так что, если linkCount
равно 5, вы хотите хранить эти записи только там, где есть как минимум пять вхождения этого Source
во входной последовательности.
Для этого нам нужно сгруппировать ваш ввод в группы с одинаковым значением для Source
. После этого мы сохраняем только те группы, которые содержат больше элементов, чем linkCount
:
IEnumerable<EdgeData> result = edgeList.GroupBy( edgeItem => edgeItem.Source)
// keep only the groups with enough elements:
.Where(group => group.Skip(linkCount).Any())
// Ungroup, so we get a neat sequence
.SelectMany(group => group);
Результатом GroupBy является последовательность объектов, в которой каждый объект реализует IGrouping<string, EdgeData>
. Этот объект сам по себе является последовательностью EdgeData
, где каждое свойство Source
имеет одинаковое значение. Это значение находится в Key
IGrouping.
После создания групп я сохраняю только те группы, в которых больше элементов linkCount. Я делаю это, пропуская первые элементы LinkCount в последовательности, в которой находится группа, и если в ней остались какие-либо элементы, то, очевидно, в группе больше элементов linkCount.
Я не хочу использовать Count (), потому что если в вашей группе есть миллион единиц, подсчет всех этих элементов будет пустой тратой вычислительной мощности, если вы можете прекратить считать после того, как увидите, что их больше, чем linkCount.
результат Where является последовательностью IGrouping<string, EdgeData>
. Чтобы разгруппировать, мы используем SelectMany
, что делает его аккуратной последовательностью EdgeData
снова.