我有一个包含以下信息的数据表:
365.00
370.00
369.59
365.00
365.00 -> match with previous item
365.00 -> match with previous item
我只需删除下一个匹配的项目,如下所示:
365.00
370.00
369.59
365.00
我试过了:
(from articlespricehistory in dt.AsEnumerable()
select new
{
articlepricehistory_cost = articlespricehistory.Field<Double>("articlepricehistory_cost")
})
.DistinctBy(i => i.articlepricehistory_cost)
.ToList();
结果:
365.00
370.00
369.59
有什么想法吗?
答案 0 :(得分:7)
另一种方法:
public static IEnumerable<T> MyDistinct<T>(this IEnumerable<T> items)
{
T previous = default(T);
bool first = true;
foreach(T item in items)
{
if (first || !Equals(previous, item))
{
first = false;
previous = item;
yield return item;
}
}
}
或者,根据要求,使用选择器
public static IEnumerable<T> MyDistinct<T, U>(this IEnumerable<T> items, Func<T, U> selector)
{
U previous = default(U);
bool first = true;
foreach(T item in items)
{
U current = selector(item);
if (first || !Equals(previous, current))
{
first = false;
previous = current;
yield return item;
}
}
}
答案 1 :(得分:3)
这是一个适合你的LINQ解决方案
var list = (dt as Enumerable);
var numbers = list.TakeWhile((currentItem, index) => currentItem != list.ElementAtOrDefault(index - 1));
请记住,如果你将0作为第一个元素,它将从新列表中省略,因为ElementAtOrDefault将在while循环的第一次迭代中返回0(索引为-1),从而将表达式计算为false。简单的if语句可以帮助您避免这种情况。
答案 2 :(得分:2)
这是一个我没有尝试的想法
Skip(1)
以生成第二个查询。 第六个查询是您想要的数据集。
答案 3 :(得分:1)
您的查询中的问题是您使用.DistinctBy()
,它将仅返回不同的结果。因此,如果365.00出现在任何地方,它将不会再次显示在返回的列表中。
var differentPreviousList = new List<double>();
var itemPriceList = dt.ToList();
differentPreviousList.Add(itemPriceList[0]);
for (var index = 1; index < itemPriceList.Count; index++)
{
if (itemPriceList[index - 1] == itemPriceList[index]) continue;
differentPriceList.Add(itemPriceList[index]);
}
答案 4 :(得分:0)
我认为您必须使用临时值来检查下一个值是否与当前值匹配。
double temporary = -1; // temp value for checking
List<double> results = new List<double>(); // list to store results
(from articlespricehistory in dt.AsEnumerable()
select new
{
articlepricehistory_cost = articlespricehistory.Field<Double>("articlepricehistory_cost")
})
.Select(a => a.articlepricehistory_cost)
.ToList()
.ForEach(cost =>
{
if (temporary != cost) { results.Add(cost); }
temporary = cost;
});
foreach (var result in results)
{
Console.WriteLine(result);
}
ForEach
方法等同于以下内容。
foreach (var cost in costs)
{
if (temporary != cost)
{
results.Add(cost);
Console.WriteLine(cost);
}
temporary = cost;
}
答案 5 :(得分:0)
它可能不是一个优雅的解决方案,但我只是解析一个简单的查询......这是怎么回事。
冲洗并重复,结果是循环中连续发现的重复对象不会存储在列表中,从而产生你想要的东西。