цикл foreach для проверки того, что идентификаторы объектов уже существуют - PullRequest
0 голосов
/ 23 октября 2019

В C # у меня есть один цикл foreach.

foreach (businfo ibusinfo in lclbbusinfo)
{
    ibusinfo.Updateperson();
}

lclbbusinfo -> содержит столбец member_id и другие столбцы releaseavnt

updateperson() -> метод, который обновляет информацию об member_id (первичном ключе), такую ​​как имя, телефон и т. Д.

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

В редких случаях lclbbusinfo может иметь одинаковые значения member_id. В этом случае первая итерация обновит таблицу членов, а затем следующая (или 3-я, 4-я и т. Д.) Также попытается обновить ту же информацию об элементе снова в той же таблице.

Так как же мыне обновлять один и тот же идентификатор члена снова и снова?

Я пытался использовать ibusinfo , чтобы проверить только предыдущий member_id.

Ответы [ 3 ]

1 голос
/ 23 октября 2019

A GroupBy() над вашей коллекцией достаточно хорошо. Но если вы ищете несколько способов реализовать проверку на наличие дубликатов, вы можете отдельно поддерживать HashSet<int> во время итерации по коллекции.

HashSet<int> unique = new HashSet<int>();

foreach( var item in lclbbusinfo )
{
    if(unique.Add(item.member_id))
    {
        item.Updateperson();
    }
}

Обновленный пример для учета комментариев.

1 голос
/ 23 октября 2019

Если вы хотите обновить только первый businfo объект из тех, которые имеют тот же member_id, вы можете использовать что-то вроде этого:

foreach (businfo ibusinfo in lclbbusinfo.GroupBy(x => x.member_id)
                                        .Select(g => g.First()).ToList())
{
    ibusinfo.Updateperson();
}

Это сгруппирует элементы lclbbusinfoкоторые имеют одинаковые member_id и выбирают только первый из них, который будет использоваться циклом foreach.

0 голосов
/ 24 октября 2019

Попробуйте это. добавить namespace => using System.linq;

        List<member_id_dataType> member_idList = lclbbusinfo.Select(x => 
        x.member_id).Distinct().ToList();
        foreach (var ibusinfo in lclbbusinfo)
        {
            if (member_idList.Contains(ibusinfo.member_id))
            {
                ibusinfo.Updateperson();
                member_idList.Remove(ibusinfo.member_id);
            }
        }
...