Если я понимаю ваше требование, вы говорите, что если идентификатор находится в обоих списках, то пользователь является старым пользователем, в противном случае это новый пользователь.
Итак, вот самый простой способ, которым я мог бы прийти чтобы сделать это:
IEnumerable<User> users =
Enumerable
.Concat(
UserArrivedList.Select(i => i.id),
OldUserList.Select(i => i.id))
.ToLookup(x => x)
.Select(x => new User() { id = x.Key, newUser = x.Count() == 1 });
Давайте проверим некоторые данные:
var UserArrivedList = new List<UserArrived>()
{
new UserArrived() { id = "A" },
new UserArrived() { id = "B" },
};
var OldUserList = new List<OldUser>()
{
new OldUser() { id = "B" },
new OldUser() { id = "C" },
};
Вот мои результаты:
B
- единственный пользователь, который появляется в обоих списках, поэтому должен быть False
.
Итак, здесь есть некоторая путаница с требованиями.
ОП добавил конкретный пример входных данных и ожидаемого результата.
var UserArrivedList = new List<UserArrived>()
{
new UserArrived() { id = "A" },
new UserArrived() { id = "B" },
new UserArrived() { id = "C" }
};
var OldUserList = new List<OldUser>()
{
new OldUser() { id = "B", lastArrived = DateTime.Now }
};
С этим входом ОР ожидает True, False, True
для A, B, C
соответственно.
Здесь это код четырех текущих ответов:
var results = new []
{
new
{
answered = "Enigmativity",
users = Enumerable
.Concat(
UserArrivedList.Select(i => i.id),
OldUserList.Select(i => i.id))
.ToLookup(x => x)
.Select(x => new User() { id = x.Key, newUser = x.Count() == 1 })
},
new
{
answered = "JQSOFT",
users = UserArrivedList.Select(x => x.id)
.Concat(OldUserList.Select(y => y.id))
.Distinct()
.Select(x => new User
{
id = x,
newUser = OldUserList.Count(o => o.id == x) == 0,
})
},
new
{
answered = "Anu Viswan",
users =
UserArrivedList
.Join(OldUserList, ual => ual.id, oul => oul.id, (ual, oul) => new User { id = oul.id, newUser = false })
.Concat(UserArrivedList.Select(x => x.id).Except(OldUserList.Select(x => x.id))
.Concat(OldUserList.Select(x => x.id).Except(UserArrivedList.Select(x => x.id)))
.Select(x=> new User{ id = x, newUser = true}))
},
new
{
answered = "Barns",
users =
UserArrivedList.Select(i => i.id)
.Union(OldUserList.Select(i => i.id))
.Select(j => new User
{
id = j,
newUser =
!(UserArrivedList.Select(i => i.id).Contains(j)
&& OldUserList.Select(i => i.id).Contains(j))})
}
};
, который дает вывод:
Итак, в настоящее время все представленные ответы соответствуют примеру ОП.
Мне было бы интересно, чтобы ОП комментировал это как входные данные:
var UserArrivedList = new List<UserArrived>()
{
new UserArrived() { id = "A" },
new UserArrived() { id = "B" },
};
var OldUserList = new List<OldUser>()
{
new OldUser() { id = "B" },
new OldUser() { id = "C" },
};
Когда я запускаю это Я получаю этот вывод:
Здесь три пользователя совпадают, а один нет.
Все это сводится к тому, что означает описание :
Как мы знаем, пользователь приходит в магазин, возможно, это новый пользователь или старый пользователь. Если идентификатор пользователя в UserArrived также содержится в OldUser, свойство newUser в новом списке имеет значение false для true.