我有5個用戶和5個服務。 我必須捕捉是否有多個用戶擁有相同的服務。所以我創建了一個字典:
我創建了一個字典。
/JMBGS represent users ids。
List<string> multipleJMBGs = new List<string>()。
multipleJMBGs.Add(data.jMBG)。
multipleJMBGs.Add(data.secondPersonJMBG)。
multipleJMBGs.Add(data.thirdPersonJMBG);
multipleJMBGs.Add(data.fourthPersonJMBG);
multipleJMBGs.Add(data.fifthPersonJMBG);
multipleJMBGs.RemoveAll(x => string.IsNullOrEmpty(x))。
//object Service有Id屬性,我需要檢查是否有多個用戶擁有同一個服務。
var serviceForClient = data?.Schedules[0].Service;
var serviceForFirstFamilyMember = data?.Schedules[1]?.Service。
var serviceForSecondFamilyMember = data?.Schedules[2]?.Service。
var serviceForThirdFamilyMember = data?.Schedules[3]? .Service。
var serviceForFourthFamilyMember = data?.Schedules[4]?.Service;
Dictionary<string, EmployeeTableDay.ServiceDTO> userService = new Dictionary<string, EmployeeTableDay.ServiceDTO> ()。
userService.Add(data.jMBG, serviceForClient)。
userService.Add(data.secondPersonJMBG, serviceForFirstFamilyMember)。
userService.Add(data.thirdPersonJMBG, serviceForSecondFamilyMember);
userService.Add(data.fourthPersonJMBG, serviceForThirdFamilyMember);
userService.Add(data.fifthPersonJMBG, serviceForFourthFamilyMember)。
我想把什么作為標志(true/false):
我希望有一個標志(true/false)。
更新 #1:
List<string> multipleJMBGs = new List<string> ()。
multipleJMBGs.Add(data.jMBG)。
multipleJMBGs.Add(data.secondPersonJMBG)。
multipleJMBGs.Add(data.thirdPersonJMBG);
multipleJMBGs.Add(data.fourthPersonJMBG);
multipleJMBGs.Add(data.fifthPersonJMBG);
multipleJMBGs.RemoveAll(x => string.IsNullOrEmpty(x))。
var countedSchedules = data?.Schedules?.Count();
var serviceIdForClient = 0;
var serviceIdForFirstFamilyMember = 0;
var serviceIdForSecondFamilyMember = 0;
var serviceIdForThirdFamilyMember = 0;
var serviceIdForFourthFamilyMember = 0;
List<int> servicesIds = new List<int> ()。
if(countedSchedules >= 1 && data?.Schedules[0]?Service != null)
{
serviceIdForClient = data.Schedules[0].Service.Id。
servicesIds.Add(serviceIdForClient)。
}
if (countedSchedules >= 2 && data?.Schedules[1].Service != null)
{
serviceIdForFirstFamilyMember = data.Schedules[1].Service.Id。
servicesIds.Add(serviceIdForFirstFamilyMember)。
}
if (countedSchedules >= 3 && data?.Schedules[2].Service != null)
{
serviceIdForSecondFamilyMember = data.Schedules[2].Service.Id。
servicesIds.Add(serviceIdForSecondFamilyMember)。
}
if (countedSchedules >= 4 && data?.Schedules[3].Service != null)
{
serviceIdForThirdFamilyMember = data.Schedules[3].Service.Id。
servicesIds.Add(serviceIdForThirdFamilyMember)。
}
if (countedSchedules == 5 && data?.Schedules[4].Service != null)
{
serviceIdForFourthFamilyMember = data.Schedules[4].Service.Id。
servicesIds.Add(serviceIdForFourthFamilyMember)。
}
servicesIds = servicesIds.Where(x => x > 0).ToList();
//before dictionary throws an exception。
for (int i = 0; i < countedSchedules; i )
{
multipleJMBGs[i] = i " _ "/span> multipleJMBGs[i]。
}
//從兩個串列中創建字典。
var dic = multipleJMBGs.Zip(servicesIds, (k, v) => new { k, v }).ToDictionary(x => x.k, x => x.v)。
var duplicateServices = dic.GroupBy(x => x.Value).Where(x => x.Count() > 1)
.Select(x => new { ServiceId = x.Key, Users = x.ToList() }) 。
var duplicateUsers = dic.GroupBy(x => x.Key.Substring(3, x. Key.Length-3)).Where(x => x.Count() > 1)
.Select(x => new { User = x.Key, Services = x.ToList() }) 。
if( duplicateServices > 1 && duplicateUsers.Count > 1)
{
//show a message that it can't be proceeed further.
}
else
{
//繼續 {
uj5u.com熱心網友回復:
你可以按Id對服務進行分組,以獲得重復的資訊:
var groups = data?.Schedules
.Select((service, index) => (service, index))
.GroupBy(x => x.service.Id)。
foreach (var g in groups) {
if (g.Count() == 1) {
Console.WriteLine(
$"服務標識{g.Key}對于用戶索引{g.First().index}")存在一次。)
} else {
string indexes = String.Join(", ", g.Select(t => t.index.ToString())。
Console.WriteLine(
$"服務標識{g.Key}被用戶索引{indexes}")共享。)
}
如果你不呼叫multipleJMBGs.RemoveAll(...),那么用戶串列中的索引將與服務的索引匹配。因此,你可以很容易地得到分配給服務的JMBG。
var groups = data?.Schedules
.Select((service, index) => (service, index))
.GroupBy(x => x.service.Id)。
foreach (var g in groups) {
if (g.Count() == 1) { //服務是唯一的。
var service = g.First().service。
int index = g.First().index;
string user = multipleJMBGs[index];
...
} else { //service assigned to more than one user.
var serviceId = g.Key;
var service = g.First().service。
foreach (var t in g) {
int index = t.index;
string user = multipleJMBGs[index];
...
}
...
}
}
uj5u.com熱心網友回復:
純粹回答關于如何在你的字典中檢查重復的問題:
你可以將你的 dictionary 的值分組,并通過這種方式來尋找重復的值。
var containsDuplicates = userService.GroupBy(x => x.Value).Any(x => x.Count() > 1) 。
如果你想實際看到哪些服務被哪些用戶多次使用,請創建以下分組:
如果你想實際看到哪些服務被哪些用戶多次使用,請創建以下分組:
var duplicateServices = userService.GroupBy(x => x.Value).Where(x => x.Count() > 1)
.Select(x => new { Service = x.Key, Users = x.ToList() }) 。
更新 #1:
如果你只需要檢查這兩個串列中是否有重復的內容,你不一定要把這兩個串列分組。
我們可以簡單地將串列的總計數與洗掉所有可能的重復數后的串列計數進行比較:
var duplicateServices = countedSchedules != data?.Schedules?
var duplicateUsers = multipleJMBGs.Count() != multipleJMBGs.Distinct().Count()。
更新 #2: 聽起來你想把兩個串列連接在一起,不一定要把它轉換為一個字典,我們要做的是創建一個新的串列,這樣我們就可以在兩個屬性的組合上進行分組。
var containsDuplicates = multipleJMBGs.Zip(serviceIds, (JMBG, serviceId) => new { JMBG, serviceId })
.Where(x => !string.IsNullOrEmpty(x.JMBG) && x.serviceId > 0) //在將兩個串列壓縮在一起之后進行過濾。
.GroupBy(x => x).Any(x => x.Count() > 1) 。
請注意,你正在洗掉兩個串列中的元素,這意味著順序可能不正確。你可以在壓縮串列后添加一個Where子句,就像上面的例子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/310057.html
標籤:
上一篇:如何對物件串列進行分組
