Запрос Linq, созданный в цикле foreach всегда, берет значение параметра от последнего повторения

Элементы списка, являющиеся словарями с одной записью, делают обработку более трудоемкой, чем необходимо. Если у вас есть только одна учетная запись на элемент в списке, вы должны вместо этого сделать их кортежами (учетная запись, распределение).

преобразование List1 в этот формат (переменная allocs) делает режим кода простым:

List1  = [{'A001':{'ABC':0.4, 'ABD':0.6}}, {'A002':{'ABC':0.5, 'ABD':0.4, 'EFG':0.1}}, {'A003':{'ABC':0.4, 'ABD':0.6}}, {'A004':{'ABC':0.4, 'ABD':0.6}}]

allocs = [ list(account.items())[0] for account in List1]
for account,alloc in allocs:
    dups = [ac for ac,al in allocs if al == alloc and ac != account]
    print( account, ", ".join(dups or ["no duplicates"]))


A001 A003, A004
A002 no duplicates
A003 A001, A004
A004 A001, A003
17
задан Boris Callens 17 November 2008 в 13:51
поделиться

2 ответа

Вы снова используете ту же переменную (key) в Вашем лямбда-выражении.

Видят мою статью о анонимные методы для получения дополнительной информации, и существуют много связанные ТАК вопросы также:

, простая фиксация должна скопировать переменную сначала:

List<string> keys = FillKeys()
foreach (string key in keys){
    string copy = key;
    q = q.Where(c => c.Company.Name.Contains(copy));
}
33
ответ дан 30 November 2019 в 10:50
поделиться

Возможно полученная переменная проблема; попытайтесь добавить:

List<string> keys = FillKeys()
foreach (string key in keys){
    string tmp = key;
    q = q.Where(c => c.Company.Name.Contains(tmp));
}
14
ответ дан 30 November 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: