循环遍历列表以查找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; }
}
有两种方法可以点。要么使用反射,要么使用公共子接口。无论如何,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
。让我们假设您想要查找任何名为findStr
的ItemListGallery
对象,或者包含名为findStr
的ItemList
对象,或者包含包含名为findStr
的Item
的ItemList
……你可以这样做:
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
。