Итак, у меня есть несколько списков типа Tag. Тег имеет несколько свойств: .Epc, .AntennaPortNumber и .LastTimeSeen. Я хочу взять все теги из основного списка и отсортировать их по 5 меньшим спискам, но сохранить только одну копию каждого .Epc, и это должен быть самый последний .LastTimeSeen. Я не совсем уверен, с чего начать. Я думал, что мне нужно что-то сделать с .GroupBy вложено пару раз? прямо сейчас код разбит на две основные части: где я добавляю новые теги в списки, в которые они входят, и где я удаляю тег, который не был замечен за 500 мс. Я попытался запретить добавление повторяющихся тегов в 5 подписок с помощью .Contains, но поскольку у них разные свойства LastTimeSeen, это не имеет желаемого эффекта.Удаление дубликатов Из списка, сохраняя последний C#
Спасибо за любые рекомендации, которые кто-либо может предоставить!
List<Tag> tags = new List<Tag>();
List<Tag> listMed1 = new List<Tag>();
List<Tag> listMed2 = new List<Tag>();
List<Tag> listMed3 = new List<Tag>();
List<Tag> listMed4 = new List<Tag>();
List<Tag> listMed5 = new List<Tag>();
void OnTagsReported(ImpinjReader sender, TagReport report)
{
// This event handler is called asynchronously
// when tag reports are available.
// Loop through each tag in the report
// and print the data.
//List<Tag> tags = new List<Tag>();
foreach (Tag tag in report)
{
ushort AntennaNum = tag.AntennaPortNumber;
Impinj.OctaneSdk.TagData first = tag.Epc;
string epcCheck = first.ToString().ToUpper();
Impinj.OctaneSdk.ImpinjTimestamp tim = tag.LastSeenTime;
if (epcCheck.IndexOf("A") != -1)
{
if (listMed1.Contains(tag) == false)
{
listMed1.Add(tag);
System. Diagnostics.Debug.WriteLine(epcCheck);
System.Diagnostics.Debug.WriteLine(tim);
}
}
else if (epcCheck.IndexOf("B") != -1)
{
if (listMed2.Contains(tag) == false)
{
listMed2.Add(tag);
}
}
else if (epcCheck.IndexOf("C") != -1)
{
if (listMed3.Contains(tag) == false)
{
listMed3.Add(tag);
}
}
else if (epcCheck.IndexOf("D") != -1)
{
if (listMed1.Contains(tag) == false)
{
listMed4.Add(tag);
}
}
else if (epcCheck.IndexOf("E") != -1)
{
if (listMed5.Contains(tag) == false)
{
listMed5.Add(tag);
}
}
int Med1num = listMed1.Count();
int Med2num = listMed2.Count();
int Med3num = listMed3.Count();
int Med4num = listMed4.Count();
int Med5num = listMed5.Count();
for (int loopr = 0; loopr < Med1num; loopr++)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed1[loopr].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 500)
{
listMed1.RemoveAt(loopr);
loopr = -1;
}
}
for (int loopr = 0; loopr < Med2num; loopr++)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed2[loopr].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 500)
{
listMed2.RemoveAt(loopr);
loopr = -1;
}
}
for (int loopr = 0; loopr < Med3num; loopr++)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed3[loopr].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 500)
{
listMed3.RemoveAt(loopr);
loopr = -1;
}
}
for (int loopr = 0; loopr < Med4num; loopr++)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed4[loopr].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 500)
{
listMed4.RemoveAt(loopr);
loopr = -1;
}
}
for (int loopr = 0; loopr < Med5num; loopr++)
{
Impinj.OctaneSdk.ImpinjTimestamp second = listMed5[loopr].LastSeenTime;
string milisecondsUTC = second.ToString();
long lastseen = Convert.ToInt64(milisecondsUTC);
TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
long secondsSinceEpoch = (long)t.TotalMilliseconds;
if (secondsSinceEpoch - lastseen > 500)
{
listMed5.RemoveAt(loopr);
loopr = -1;
}
}
Med1num = listMed1.Count();
Med2num = listMed2.Count();
Med3num = listMed3.Count();
Med4num = listMed4.Count();
Med5num = listMed5.Count();
SetText(Med1num, Med2num, Med3num, Med4num, Med5num);
}
}
Я правильно говорю, что параметр «TagReport» - это список обновленных тегов? Это не весь список, но со временем больше событий с событиями «TagsReported», которые вы создаете для списков listMed {X} 'из тегов в« TagReport ». – Enigmativity
Правильно ли я говорю следующее. Вы добавляете ВСЕ теги к списку с именем tag. Затем из этого списка вы перемещаете тег в listMed1, listMed2 и т. Д., В зависимости от того, где они принадлежат. Если тег не был замечен в <500 мс, он удаляется из тега или listMed1, listMed2 ...? – Eminem
Ответы на два вопроса: да. – Lodestone6