C# 遍历对象列表,找到价格最高的对象,将其设置为活动,并禁用所有其他对象

C# 遍历对象列表,找到价格最高的对象,将其设置为活动,并禁用所有其他对象,c#,linq,for-loop,C#,Linq,For Loop,我有一个带有价格属性的产品列表 我需要遍历产品列表,并将价格最高的产品设置为Enabled=true。诀窍是,我需要使剩余的产品不是MAX to Enabled=false 这是我当前的代码,但每次运行foreach循环将所有其他循环设置为Enabled=false时,我都感觉很糟糕。必须有更好的方法: decimal maxPrice = 0; for (int i = 0; i < products.Count; i++) { Product product = product

我有一个带有价格属性的产品列表

我需要遍历产品列表,并将价格最高的产品设置为Enabled=true。诀窍是,我需要使剩余的产品不是MAX to Enabled=false

这是我当前的代码,但每次运行foreach循环将所有其他循环设置为Enabled=false时,我都感觉很糟糕。必须有更好的方法:

decimal maxPrice = 0;
for (int i = 0; i < products.Count; i++)
{
    Product product = products[i];

    if (product.Price > maxPrice)
    {
        maxPrice = product.Price;
        product.Enabled = true;

        // Set all others to Disabled
        foreach (Product other in products.Where(p => p.Id != product.Id))
        {
            other.Enabled = false;
        }
    }
}
十进制maxPrice=0;
对于(int i=0;imaxPrice)
{
maxPrice=产品价格;
product.Enabled=true;
//将所有其他设置为禁用
foreach(products.Where中的其他产品(p=>p.Id!=Product.Id))
{
other.Enabled=false;
}
}
}

如果默认情况下,所有产品都启用了带有
false
值的
属性,则只需在
中为
保存最大值索引即可:

int index=0;
for (int i = 1; i < products.Count; i++)
{
    if (products[i].Price > products[index].Price)
        index=i;
}
products[index].Enabled = true;

两个简单的foreach循环应该可以做到这一点

decimal maxPrice = 0

foreach (product p in products)
{
    if (p.Price > maxPrice)
        maxPrice = p.Price;
}

foreach (product p in products)
{
    if (p.Price == maxPrice)
        p.Enabled = true;
    else
        p.Enabled = false;
}

为了解决这个问题,我创建了一个具有以下属性的虚拟类:

public class Foo
{
    public string Name { get; set; }
    public int Value { get; set; }
    public bool Enabled { get; set; }
}
并创建了如下列表:

var list = new List<Foo>();
list.Add(new Foo(){ Name = "Thing 1", Value = 1});
list.Add(new Foo(){ Name = "Thing 2", Value = 3});
list.Add(new Foo(){ Name = "Thing 3", Value = 5});
list.Add(new Foo(){ Name = "Thing 4", Value = 2});
list.Add(new Foo(){ Name = "Thing 5", Value = 4});
然后可以按降序对其重新排序,以便从最高值到最低值:

list = list.OrderByDescending(l => l.Value).ToList();
或者,如果要按降序对列表进行排序,可以执行以下操作:

list.Sort((a, b) => b.Value.CompareTo(a.Value));
最后,您可以将第一个项目的Enabled属性设置为true:

list.FirstOrDefault(l => l.Enabled = true);

如果它们还不是false,您可以在测试工作正常之前在for循环中将它们设置为false,但请确认if语句中存在类型product'应该是'products'对吗?@octavioccl另外,你能告诉我如何设置为false以确保安全,就像前面提到的user3486184一样。第一个是默认的最大值,这就是为什么我在index=1中开始循环。如果其他元素大于指数变量,则更新指数变量。答案很好,但问题是我不喜欢在最后比较价格。我宁愿使用一个Id或一些独特的东西,假设可以有多个具有最高价格。在这种情况下,我想采用两种方法中的第一种。如果你有一个100种产品的列表,并且其中三种产品的最大值完全相同,你想如何处理这种情况?将它们全部设置为启用,还是仅将第一个设置为启用?还有别的吗?我只会选择第一个,并且只启用那个。你能在这个基础上调整你的函数吗?我添加了一个答案,它只设置了第一个要启用的项。
list.Sort((a, b) => b.Value.CompareTo(a.Value));
list.FirstOrDefault(l => l.Enabled = true);