以有序的方式获取一个列表<tuple>

Foreach a list<tuple> in an ordered fashion

我有一个列表,其中填充了来自我的 entityframework 的数据。此数据按 ID 排序。

我想以有序的方式 foreach 这个列表,这样我就可以注册哪个 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 文件中插入项目。因此,如果元组中的第一项相同,则不应插入新行,而应使用现有行。

如果您已经保留了 matchedIDs 的列表,则不需要对列表进行排序。就像您已经在做的那样:

List<int> matchedIDs = new List<string>();
foreach(var item in tupleList)
{
  if(matchedIDs.contains(item.ID))
  {
   // do something
  }
  else
  {
   // do something else
    matchedIDs.Add(item.ID);
  }
} 

如果保留已出现 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
   }
} 

如果真的要排序,可以使用LINQs OrderBy函数:

var orderedTupleList = tupleList.OrderBy(t => t.ID);

为了您的目的(本质上是查找 table),HashSet 更适合:

HashSet<int> matchedIDs = new HashSet<int>();

其余代码保持不变。

A HashSet 更好,因为它的查找时间为 O(1),这意味着无论它有多大,它都保持不变。一个List的查找时间为O(n),它要运行遍历每一个元素来判断你要找的元素是否在里面。

您可能希望按 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 感兴趣,请使用不同的:

foreach(var id in tupleList.Select(x => x.Id).Distinct())
{
  // do something with id
}

另一种 select 重复的方法是使用 GroupBy:

var grp = tupleList.GroupBy(tl => tl.Id);
var duplicates = grp.Where(g => g.Count() > 1);
var nonDuplicates = grp.Where(g => g.Count() == 1);

由于列表中已有原始项目,我们只需要保留已处理的 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);
                    }
                }
            }