我的列表中填充了来自entityframework的数据。此数据按ID排序。
我想以有序的方式预先知道此列表,以便我可以注册已处理的ID。因为列表中的ID可以出现多次。
所以基本上是这样的:
List<int> matchedIDs = new List<string>();
foreach(var item in tupleList)
{
if(matchedIDs.contains(item.ID))
{
// do something
}
else
{
// do something else
}
}
可以这样做。因此,每次在foreach中出现一个新项目时,该项目具有相同的ID?
PS:我有兴趣匹配重复项,因为我在csv文件中插入项目。因此,如果元组中的第一项是相同的,则不应插入新行,而是使用现有的。
答案 0 :(得分:1)
如果你保留已经发生的ID列表,你真的不需要排序。此代码应该满足您的需求:
List<int> matchedIDs = new List<int>();
foreach(var item in tupleList)
{
if(matchedIDs.Contains(item.ID))
{
//do something
} else {
matchedIDs.Add(item.ID);
//do something else
}
}
如果您真的想要排序,可以使用LINQ OrderBy
函数:
var orderedTupleList = tupleList.OrderBy(t => t.ID);
出于您的目的(基本上是查找表),HashSet
更适合:
HashSet<int> matchedIDs = new HashSet<int>();
其余代码保持不变。
HashSet
更好,因为它的查找时间为O(1),这意味着无论它有多大,它都保持不变。 List
的查找时间为O(n),它必须遍历每个元素以确定您要查找的元素是否在其中。
答案 1 :(得分:1)
您可能希望按ID进行分组:
foreach(var group in tupleList.GroupBy(x => x.ID))
{
var id = group.Key;
var firstItemWithThisId = group.First();
// iterate the items in the group
foreach (var item in group)
{
// do something with the item
}
// do something
}
或者如果您只对ID感兴趣,请使用distinct:
foreach(var id in tupleList.Select(x => x.Id).Distinct())
{
// do something with id
}
答案 2 :(得分:1)
选择重复项的另一种方法是使用GroupBy
:
var grp = tupleList.GroupBy(tl => tl.Id);
var duplicates = grp.Where(g => g.Count() > 1);
var nonDuplicates = grp.Where(g => g.Count() == 1);
答案 3 :(得分:0)
如果您已经保留了$val
的列表,则无需对列表进行排序。就像你已经在做的那样:
matchedIDs
答案 4 :(得分:0)
由于您已经在列表中有原始项目,我们只需要保留已处理的ID列表和流程结束,您将获得未处理的记录列表。
List<int> matchedIDs = new List<string>();
foreach (var item in tupleList)
{
if (matchedIDs.contains(item.ID))
{
// do something
}
else
{
if (processed) // process the records and if process then add into list.
{
matchedIDs.Add(item.ID);
}
}
}