【发布时间】:2014-08-12 01:41:50
【问题描述】:
我希望为一个简单的集合场景编写linq 语句。我试图避免基于父子关系的集合中的重复项目。数据结构和示例代码如下
public class Catalog
{
public int CatalogId { get; set; }
public int ParentCatalogId { get; set; }
public string CatalogName { get; set; }
}
public class Model
{
public int CatalogId { get; set; }
public string ItemName { get; set; }
...
}
List<Catalog> Catalogs:包含与所有目录的任何级别的父子关系的完整列表以及带有ParentCatalogid=null的根目录
List<Model> CollectionA :包含特定 catalogId 的所有子目录以及父目录的所有项目(直到它的根目录)。
我需要从 CollectionA 创建一个 CollectionB ,它将包含提供的 catalogId 的项目,包括所有父母的所有项目,这样如果项目存在于子目录中,我需要忽略父目录中的相同项目。这样,如果子项和父项中都有相同的项,则不会有任何重复项。
就代码而言,我正在尝试实现这样的目标
while (catalogId!= null)
{
CollectionB.AddRange(
CollectionA.Where(x => x.CatalogId == catalogId &&
!CollectionB.Select(y => y.ItemName).Contains(x.ItemName)));
// Starting from child to parent and ignoring items that are already in CollectionB
catalogId = Catalogs.
Where(x => x.Id == catalogId).
Select(x => x.ParentCatalogId).
FirstOrDefault();
}
我知道上面语句中 linq 中的 Contains 子句将不起作用,但只是将该语句用于解释我要做什么。我可以使用foreach 循环来做到这一点,但我只想使用linq。我正在寻找正确的 linq 语句来执行此操作。下面给出了示例数据,如果我能得到一些帮助,将不胜感激
Catalog
ID ParenId CatalogName
1 null CatalogA
2 1 Catalogb
3 1 CatalogC
4 2 CatalogD
5 4 CatalogE
CollectionA
CatalogId ItemName
5 ItemA
5 ItemB
4 ItemA
4 ItemC
2 ItemA
2 ItemC
1 ItemD
Expected output
CollectionB
5 ItemA
5 ItemB
4 ItemC
1 ItemD
【问题讨论】:
标签: c# linq duplicates hierarchical-data relation