static IEnumerable<Tuple<Double, Double>> GetGreatest(List<List<Tuple<double,double>>> lst)
{
var tempHead = lst[0][0];
for (int i = 1; i < lst.Count; i++)
{
if (i != lst.Count - 1)
{
var previousHead = lst[i - 1][0];
var currentHead = lst[i][0];
if (previousHead.Item2 != currentHead.Item1)
{
yield return Tuple.Create(tempHead.Item1, previousHead.Item2);
tempHead = currentHead;
}
}
else yield return Tuple.Create(tempHead.Item1, lst[i][0].Item2);
}
}
我正在尝试以一种更实用的方式编写此代码,以便我可以更轻松地将其集成到其他语言(例如Scala或F#)的项目中,我的问题是我一直在努力奋斗一个多小时,但似乎无法将其转换为可用的东西,至少在scala中不可用。
问题:我能否得到一些提示,以指出正确的方向?这样我就可以解开自己...
澄清:消除有关命名等方面的可能混淆
这是如何使用的:
var lst = new List<Tuple<double,double>>{
Tuple.Create(3.22, 3.29), Tuple.Create(3.22, 4.05), Tuple.Create(3.22, 4.12),
Tuple.Create(3.29, 4.05), Tuple.Create(3.29, 4.12),
Tuple.Create(4.05, 4.12),
Tuple.Create( 9.06, 9.13),Tuple.Create( 9.06, 9.20),Tuple.Create( 9.06, 9.27),
Tuple.Create( 9.13, 9.20),Tuple.Create( 9.13, 9.27),Tuple.Create( 9.13,10.04),
Tuple.Create( 9.20, 9.27),Tuple.Create( 9.20,10.04),Tuple.Create( 9.20,10.11),
Tuple.Create( 9.27,10.04),Tuple.Create( 9.27,10.11),Tuple.Create( 9.27,10.18),
Tuple.Create(10.04,10.11),Tuple.Create(10.04,10.18),Tuple.Create(10.04,10.25),
Tuple.Create(10.11,10.18),Tuple.Create(10.11,10.25),Tuple.Create(10.11,11.01),
Tuple.Create(10.18,10.25),Tuple.Create(10.18,11.01),Tuple.Create(10.18,11.08),
Tuple.Create(10.25,11.01),Tuple.Create(10.25,11.08),Tuple.Create(10.25,11.15),
Tuple.Create(11.01,11.08),Tuple.Create(11.01,11.15),Tuple.Create(11.01,11.22),
Tuple.Create(11.08,11.15),Tuple.Create(11.08,11.22),Tuple.Create(11.08,11.29),
Tuple.Create(11.15,11.22),Tuple.Create(11.15,11.29),Tuple.Create(11.15,12.06),
Tuple.Create(11.22,11.29),Tuple.Create(11.22,12.06),Tuple.Create(11.22,12.13),
Tuple.Create(11.29,12.06),Tuple.Create(11.29,12.13),Tuple.Create(11.29,12.20),
Tuple.Create(12.06,12.13),Tuple.Create(12.06,12.20),Tuple.Create(12.06,12.27),
Tuple.Create(12.13,12.20),Tuple.Create(12.13,12.27),
Tuple.Create(12.20,12.27),
};
var glist = lst.GroupBy(i => i.Item1).Select(i => i.ToList()).ToList(); // creates list of lists
var greatest = GetGreatest(glist).ToList();
最终(在这种情况下)将生成2个元组(3.22, 4.12)
,(9.06, 12.27)
因此从某种意义上说,在Item2中获得了最大的数量
请注意,数据始终按顺序排序,因此下一项总是比前一项大,因此无需进行比较
这种混乱的目的是获取任何不重叠的数字组中的第一个和最后一个数字,因此,如果您查看上面的集合,您会发现在休息之前我有数字3.22、3.29、4.05和4.12所有它们都在元组中重叠,就意味着(3.22, 3.29)
包含3.29,这是下面的元组的第一个元素
该方法的作用是返回一个元组,该元组包含每个“组”元组中的第一个和最后一个不重叠的数字
我忽略除子列表中第一项以外的所有内容的原因是,因为我可以看到Item2
第一个元素的元素Item1
与下一个元素相同(我已编写了列表,因此每一行都对应一个子列表,以使其变得更容易),因此,没有理由将其余列表包括在内
为什么将其余列表放在您首先要求的位置?没有我的选择...这是来自服务器的数据(的模型),它的结构如何,实际上我无能为力
程序要做的是寻找差距,打破连续性,如果它找到了一个Item2
不相等的点,Item1
那必须意味着我们已经在数据中发现了差距,并且我们可以安全地Item1
从第一个列表和Item2
最后一个列表中进行推送在缺口之前列出,并放入我们要产生的元组中,从而将所有重叠的数据减少到仅重要的起点和终点,从而消除中间的所有膨胀。
看来您的要求如下:
从每个内部元组列表中获取第一项;每个内部列表中的其余项目都可以忽略。
将这些元组分组,而上对的第二项等于下一项的第一个值
将每个组转换为一个包含第一个项目的第一个值和最后一个项目的第二个值的单个元组。
现在,我们可以创建一个方法调用来执行这些单独操作中的每一个。
static IEnumerable<Tuple<Double, Double>> GetGreatest(
List<List<Tuple<double, double>>> list)
{
return list.Select(inner => inner.First())
.GroupWhile((previous, current) => previous.Item2 == current.Item1)
.Select(group => Tuple.Create(group.First().Item1, group.Last().Item2));
}
GroupWhile
定义如下:
public static IEnumerable<IEnumerable<T>> GroupWhile<T>(
this IEnumerable<T> source, Func<T, T, bool> predicate)
{
using (var iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
yield break;
List<T> list = new List<T>() { iterator.Current };
T previous = iterator.Current;
while (iterator.MoveNext())
{
if (!predicate(previous, iterator.Current))
{
yield return list;
list = new List<T>();
}
list.Add(iterator.Current);
previous = iterator.Current;
}
yield return list;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句