在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; }
}
答案 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
。