我有一个关于大量文件的详细信息列表。此列表包含文件ID,上次修改日期和文件路径。问题是文件的副本是旧版本,有时会有不同的文件路径。我想只存储文件的最新版本,无论文件路径如何。所以我创建了一个遍历有序列表的循环,检查ID是否唯一,如果是,则将其存储在新的唯一列表中。
var ordered = list.OrderBy(x => x.ID).ThenByDescending(x => x.LastModifiedDate);
List<Item> unique = new List<Item>();
string curAssetId = null;
foreach (Item result in ordered)
{
if (!result.ID.Equals(curAssetId))
{
unique.Add(result);
curAssetId = result.ID;
}
}
然而,这仍然允许重复进入数据库,我无法弄清楚为什么这段代码没有按预期工作。重复我的意思是,文件具有相同的ID但不同的文件路径,就像我之前说的那样不应该是一个问题。我只是想要最新版本而不管路径。任何人都可以看到问题是什么?感谢
var ordered = listOfItems.OrderBy(x => x.AssetID).ThenByDescending(x => x.LastModifiedDate);
List<Item> uniqueItems = new List<Item>();
foreach (Item result in ordered)
{
if (!uniqueItems.Any(x => x.AssetID.Equals(result.AssetID)))
{
uniqueItems.Add(result);
}
}
这就是我现在所拥有的,它仍然允许重复
答案 0 :(得分:3)
这是因为,您没有搜索整个列表来检查ID是否唯一
List<Item> unique = new List<Item>();
string curAssetId = null; // here is the problem
foreach (Item result in ordered)
{
if (!result.ID.Equals(curAssetId)) // here you only compare the last value.
{
unique.Add(result);
curAssetId = result.ID; // You are only assign the current ID value and
}
}
要解决此问题,请更改以下内容
if (!result.ID.Equals(curAssetId)) // here you only compare the last value.
{
unique.Add(result);
curAssetId = result.ID; // You are only assign the current ID value and
}
到
if (!unique.Any(x=>x.ID.Equals(result.ID)))
{
unique.Add(result);
}
答案 1 :(得分:2)
我不知道这段代码是否只是简化了,但您是否考虑过对ID进行分组,在LastModifiedDate上进行排序,然后从每个组中取出第一个?
类似的东西:
var unique = list.GroupBy(i => i.ID).Select(x => x.OrderByDescending(y => y.LastModifiedDate).First());
答案 2 :(得分:1)
var ordered = list.OrderBy(x => x.ID).ThenByDescending(x => x.LastModifiedDate).Distinct()
??
答案 3 :(得分:0)
为此,您必须创建自己的EquityComparer,之后您可以使用linq的Distinct方法。 Enumerable.Distinct at msdn
此外,我认为您可以使用当前代码,但必须以这种方式修改它(作为示例):
var ordered = list.OrderByDescending(x => x.LastModifiedDate);
var unique = new List<Item>();
foreach (Item result in ordered)
{
if (unique.Any(x => x.ID == result.ID))
continue;
unique.Add(result);
}
答案 4 :(得分:0)
List<Item> p = new List<Item>();
var x = p.Select(c => new Item
{
AssetID = c.AssetID,
LastModifiedDate = c.LastModifiedDate.Date
}).OrderBy(y => y.id).ThenByDescending(c => c.LastModifiedDate).Distinct();