Foreach列表<;元组>;以有序的方式

本文关键字:方式 元组 列表 lt Foreach gt | 更新日期: 2023-09-27 18:26:21

我有一个列表,其中填充了来自实体框架的数据。此数据按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?

附言:我对匹配重复感兴趣,因为我在csv文件中插入项目。因此,如果元组中的第一个项相同,则不应插入新行,而应使用现有行。

Foreach列表<;元组>;以有序的方式

您可能需要按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
}

选择重复项的另一种方法是使用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<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),它必须遍历每个元素,以确定您要查找的元素是否在其中。

如果您已经保留了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<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);
                    }
                }
            }