循环遍历列表以查找name属性

本文关键字:name 属性 查找 遍历 列表 循环 | 更新日期: 2023-09-27 18:11:57

在c#中,找到嵌套在列表中的对象名称的最佳方法是什么?

这是我的类:

public class ItemListGallery
{
    public string name { get; set; }
    public List<ItemList> ListItems { get; set; }
}
public class ItemList
{
    public string name { get; set; }
    public List<Item> items { get; set; }
}
public class Item
{
    public string name { get; set; }
}

如果我有一个List<ItemListGallery>,并且List<ItemListGallery>中的每个项目都有一个List<ItemList>, List<ItemList>中的每个项目都有一个Item,并且我有一个name值要查找,我如何返回具有特定name值的对象/列表?

每个name属性都是唯一的。

我试着写一些查找代码,但我迷路了。在这种情况下,IEnumerable有什么高级特性可以帮助我吗?

请帮我一下好吗?

Thanks in advance

编辑

这里是我想写的查找代码,这是正确的方法吗?

public class ItemListGallery
{
    public string name { get; set; }
    public List<ItemList> ListItems { get; set; }
    public string Find(string name)
    {
        foreach (var item in ListItems) 
        {
            if (item.Find(name) != null) 
            {
                return name;
            }
        }
        return null;
    }
}
public class ItemList
{
    public string name { get; set; }
    public List<Item> items { get; set; }
    public string Find(string name)
    {
        foreach (var item in items) 
        {
            if (item.name != null) 
            {
                return name;
            }
        }
        return null;
    }
}
public class Item
{
    public string name { get; set; }
}

循环遍历列表以查找name属性

有两种方法可以点。要么使用反射,要么使用公共子接口。无论如何,listtitems和items应该具有相同的名称,以便为关系提供一些逻辑。

public List<Item> ListItems { get; set; }
public List<ItemList> ListItems { get; set; }

这是一种使用公共接口的方法

public interface IItem 
{
    String Name { get; set; }
}
public interface IContainerItem
{
    List<IItem > ListItems { get; }
}

public class ItemListGallery : IContainerItem, IItem
..... 

public class ItemList: IContainerItem, IItem 
.....
public class Item : IItem 

那么你可以这样递归地检索它:

private static IItem DoSearch(List<IItem> rootItems, String name) {
    foreach (var item in rootItems) { 
        if (item.Name == name){
            return item ; 
        } 
        if (item is IContainerItem) {
            var containerItem = (IContainerItem) item; 
            var result = DoSearch(containerItem .ListItems , name) ; 
            if (result != null) {
                return result ; 
            }
        }
    } 
    return null ; 
}

使用最简单的是LINQ。

给定一个搜索参数findStr。让我们假设您想要查找任何名为findStrItemListGallery对象,或者包含名为findStrItemList对象,或者包含包含名为findStrItemItemList……你可以这样做:

var findqry = 
    (
        from gal in galleryList
        where 
            gal.name == findStr ||
            gal.ListItems.Any(li => 
                li.name == findStr || 
                li.Items.Any(i => i.name == findStr)
            )
        select gal
    );

如果你只想要一个单一的结果,findqry.FirstOrDefault()会给你。如果您想要所有的结果,findqry.ToList()findqry.ToArray()将返回所有的结果。

注意,在LINQ to Objects中这样做会导致区分大小写的比较,就像==string s的任何其他用法一样。另一方面,LINQtoSQL将根据所比较的字段/表/数据库的排序规则进行区分大小写或不区分大小写的比较。

如果你想做不区分大小写的比较,使用string.Compare(object.name, findStr, true) == 0或类似的代替object.name == findstr