如何将列表项的索引值与同一列表的所有索引进行比较

本文关键字:列表 索引 比较 索引值 | 更新日期: 2023-09-27 17:58:34

我有一个正在迭代多次的列表。它将rangename作为项。我的要求是当该列表的任何索引处的rangename等于其他索引处的rangename时执行操作。我正在使用以下代码。

 var bList = new List<Budget.budget_data>(); 
       for (int z = 0; z < bList.Count; z++)
   {
   if (bList [z].Range == bList.Where(a => bList.Any(x => x.Range ==x.Range)))
 {
     //need to perform action
 }

}

这是一个错误。如何将列表项的一个索引值和同一列表上的所有索引进行比较。

如何将列表项的索引值与同一列表的所有索引进行比较

根据我从您的问题中了解到的情况,您希望在列表中的两个范围相等时执行一些操作。以下内容应该对您有效。

var bList = new List<Budget.budget_data>();
        for (var i = 0; i < bList.Count; i++)
        {
            for (var j = i + 1; j < bList.Count; j++)
            {
                if (bList[i].Range == bList[j].Range)
                {
                    //Perform your action
                }
            }
        }

如果列表中有任何重复的范围,这将执行您的操作。

听起来像是你在试图找到重复项,但却不清楚自己想要实现什么,这很难帮助你找到一个合适的问题解决方案。

使用您提供的一些详细信息,下面是一个在重复项中循环的通用解决方案。

public static void Main()
{
    var budgets = new List<Budget>()
    {
        new Budget(){ Id = 1, Range = "A" },
        new Budget(){ Id = 2, Range = "B" },
        new Budget(){ Id = 3, Range = "C" },
        new Budget(){ Id = 4, Range = "C" },
        new Budget(){ Id = 5, Range = "A" }
    };
    var duplicateBudgetGroups = budgets.GroupBy(budget => budget.Range).Where(group => group.Count() > 1);
    foreach (var duplicateBudgets in duplicateBudgetGroups)
    {
        Console.WriteLine("Duplicate Range {0}", duplicateBudgets.Key);
        foreach (var budget in duplicateBudgets)
        {
            Console.WriteLine("Budget {{ Id = {0}, Range = {1} }}", budget.Id.ToString(), budget.Range);
        }
    }
}
class Budget {
    public int Id { get; set; }
    public string Range { get; set; }
}

我已经将此添加到dotnetfiddle中,这样您就可以看到它的工作:https://dotnetfiddle.net/65gF6f

我觉得没有问得太清楚,但你可以试试这个:

var bList = new List<Budget.budget_data>();
// ...
var z = ...;
for (var x = 0; x < bList.Count; ++x)
{
  if (x == z)
    continue;
  if (bList[z].Range == bList[x].Range)
  {
    //need to perform action
  }
}

这会为每个匹配的索引x执行一次操作,因此该操作可以运行多次。如果只想执行一次操作,则可以使用break;语句来完成if块(完全退出循环)。

注意:这假设.Range的类型是这样的,因此使用==是合理的。.Range的声明类型是什么?


我可能误解了这个问题。如果你想确定是否有任何重复,你可以:

var bList = new List<Budget.budget_data>();
// ...
var uniqueRangeValues = new HashSet<string>();
foreach (var b in bList)
{
  if (!uniqueRangeValues.Add(b.Ranges))
  {
    // perform action
    break; // omit if you want to perform the action several times
  }
}