Also habe ich mehrere Listen vom Typ Tag. Das Tag hat mehrere Eigenschaften: .Epc, .AntennaPortNumber und .LastTimeSeen. Ich möchte alle Tags aus der Hauptliste nehmen und sie in 5 kleinere Listen sortieren, aber nur eine Kopie von jedem .Epc behalten und es muss das neueste .LastTimeSeen sein. Ich bin mir nicht sicher, wo ich überhaupt anfangen soll. Ich dachte, ich muss etwas mit .GroupBy tun ein paar Mal verschachtelt? Im Moment ist der Code in zwei Hauptteile aufgeteilt: wo ich neue Tags zu den Listen hinzufüge, in die sie gehören, und wo ich ein Tag entferne, das für 500ms nicht gesehen wurde. Ich habe versucht zu verhindern, dass doppelte Tags zu den 5 Unterlisten mit .Contains hinzugefügt werden, aber da sie unterschiedliche LastTimeSeen-Eigenschaften haben, hat dies nicht den gewünschten Effekt.Entfernen von Duplikaten aus einer Liste unter Beibehaltung der neuesten C#
Vielen Dank für jede Anleitung, die jemand zur Verfügung stellen könnte!
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);
}
}
Stimmt es, dass der Parameter 'TagReport' eine Liste aktualisierter Tags ist? Es ist nicht die ganze Liste, aber im Laufe der Zeit feuern mehr 'TagsReported' Ereignisse ab, die Sie für' listMed {X} 'Listen aus den Tags in' TagReport' aufbauen. – Enigmativity
Stimmt das, wenn ich folgendes sage. Sie fügen ALLE Tags zu Ihrer Liste mit dem Namen tag hinzu. Dann verschieben Sie das Tag aus dieser Liste in listMed1, listMed2 usw., je nachdem, wo sie hingehören. Wenn ein Tag nicht in <500 ms angezeigt wurde, wird es aus tag oder listMed1, listMed2 ... entfernt. – Eminem
beide Fragen werden mit ja beantwortet. – Lodestone6