gpt4 book ai didi

c# - 如何使用 LINQ 比较 List<> 中顺序 "neighbors"的值?

转载 作者:行者123 更新时间:2023-11-30 15:08:10 24 4
gpt4 key购买 nike

看看这段代码:

        ColorResult contains Index, Color Name, and Probability

Colors.Add(new ColorResult(1, "Unknown", 5f));
Colors.Add(new ColorResult(2, "Blue", 80f));
Colors.Add(new ColorResult(3, "Blue", 80f));
Colors.Add(new ColorResult(4, "Green", 40f));
Colors.Add(new ColorResult(5, "Blue", 80f));
Colors.Add(new ColorResult(6, "Blue", 80f));
Colors.Add(new ColorResult(7, "Red", 20f));
Colors.Add(new ColorResult(8, "Blue", 80f));
Colors.Add(new ColorResult(9, "Green", 5f));

使用 LINQ,您将如何完成以下任务:

1) 按顺序工作,当前两个概率高于 60 的项目具有相同值时,替换 List<> 开头概率低于 60 的所有项目(“未知”变为“蓝色” "因为 #2 和 #3 是蓝色的并且概率为 60+)

2) 替换概率低于 60 且被四个具有相同值的邻居包围的项目(“绿色”变为“蓝色”,因为 #2、#3、#5 和 #6 是蓝色并且概率为 60 +)

3) 按顺序工作,替换 List<> 末尾的任何项目,这些项目前面有两个具有相同值的项目(与第一部分相同,但相反)。在示例数据中,#9 不会发生任何事情,因为#7 需要为“蓝色”并且需要 60+ 概率。

这对于循环来说非常简单,但我对如何在 LINQ 中比较连续的“邻居”感到非常困惑。

这是我对第 1 部分的原始解决方案:

        bool partOneCompleted = false;
for (int i = 0; i < Colors.Count; i++)
{
if (Colors[i].ResultConfidence > 60)
{
// This item does not need to be changed
partOneCompleted = true;
}
if (!partOneCompleted)
{
int twoItemsAway = i + 2;
if (twoItemsAway < Colors.Count)
{
if (Colors[twoItemsAway].Name == Colors[twoItemsAway - 1].Name && Colors[twoItemsAway].ResultConfidence > 60 && Colors[twoItemsAway - 1].ResultConfidence > 60)
{
// The next item, and the one after that both have the same value and 60+ confidence
for (int loopBack = i; loopBack >= 0; loopBack--)
{
Colors[loopBack].Name = Colors[twoItemsAway].Name;
}

partOneCompleted = true;
}
}
}
}

LINQ 专家能否分享最有效的实现方案?

最佳答案

这是第一个例子,让你继续。关键是使用 Enumerable.Range 所以你有索引。如前所述,使用循环会更具可读性。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;

namespace ConsoleApplication1
{
public class ColorResult
{
public int Index;
public string Name;
public float Prob;

public ColorResult(int Index, string Name, float Prob)
{
this.Index = Index;
this.Name = Name;
this.Prob = Prob;
}

public override string ToString()
{
return Index.ToString() + ", " + Name + ", " + Prob.ToString();
}
}

class Program
{
public static void Main()
{
List<ColorResult> Colors = new List<ColorResult>();

Colors.Add(new ColorResult(1, "Unknown", 5f));
Colors.Add(new ColorResult(2, "Blue", 80f));
Colors.Add(new ColorResult(3, "Blue", 80f));
Colors.Add(new ColorResult(4, "Green", 40f));
Colors.Add(new ColorResult(5, "Blue", 80f));
Colors.Add(new ColorResult(6, "Blue", 80f));
Colors.Add(new ColorResult(7, "Red", 20f));
Colors.Add(new ColorResult(8, "Blue", 80f));
Colors.Add(new ColorResult(9, "Green", 5f));


var test1 = from i in Enumerable.Range(0, Colors.Count)
select (i < Colors.Count - 2 &&
(Colors[i].Prob < 60f) &&
(Colors[i + 1].Name == Colors[i + 2].Name) &&
(Colors[i+1].Prob > 60f) &&
(Colors[i+2].Prob > 60f)) ?
new ColorResult(1, Colors[i + 1].Name, Colors[i].Prob) :
Colors[i];


}
}
}

关于c# - 如何使用 LINQ 比较 List<> 中顺序 "neighbors"的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5908606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com