循环遍历列表以查找名称属性

时间:2014-07-07 08:11:35

标签: c# list object recursion find

在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值的对象/列表?

每个名称属性都是唯一的。

我试过写一些查找代码但是丢了。 IEnumerable的高级功能是否可以用来帮助解决这种情况?

我可以请一点帮忙吗?

提前致谢

修改

以下是我要编写的查找代码,这是正确的方法吗?

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; }
}

2 个答案:

答案 0 :(得分:3)

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

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 ; 
}

答案 1 :(得分:-2)

最简单的用途是LINQ。

给定一个名为findStr的搜索参数。假设您要查找名为ItemListGallery的任何findStr对象,或者包含名为ItemList的{​​{1}}对象,或者包含findStr }包含名为ItemList的{​​{1}} ...您可以这样做:

Item

如果您只想要一个结果,findStr会给您。如果您想要所有结果,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()将全部归还。

请注意,在LINQ to Objects中执行此操作将导致区分大小写的比较,就像findqry.ToList()findqry.ToArray()的任何其他用法一样。另一方面,LINQtoSQL将根据所比较的字段/表/数据库的排序规则进行区分大小写或不区分大小写的比较。

如果您想进行不区分大小写的比较,请使用==或类似内容而不是string