Select linq 中另一个列表中包含的列表元素
Select list elements contained in another list in linq
我有一个带“|”的字符串分隔符:
string s = "item1|item2|item3|item4";
每个对象都有一个名称和值的列表:
//object
List<ItemObject> itemList = new List<ItemObject>();
itemList.Add(new ItemObject{Name="item0",Value=0});
itemList.Add(new ItemObject{Name="item1",Value=1});
//class
public class ItemObject(){
public string Name {get;set;}
public int Value {get;set;}
}
下面的代码在linq中如何在一行中完成?
var newList = new List<object>();
foreach (var item in s.Split("|"))
{
newList.Add(itemList.FirstOrDefault(x => x.Name == item));
}
// Result: newList
// {Name="item1",Value=1}
试试这个:
var newList = itemList.Where(item => s.Split('|').Contains(item.Name));
建议的解决方案还可以防止使用 null
中不存在的项目填充 newList
。您也可以考虑进行更严格的字符串相等性检查。
我建议从一开始就拆分字符串。通过这样做,我们不会在每次迭代期间拆分它:
List<ItemObject> newList = s
.Split("|")
.SelectMany(x => itemList.Where(i => i.Name == x))
.ToList();
甚至更好:
List<ItemObject> newList = s
.Split("|") // we can also pass second argument: StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
.Distinct() // remove possible duplicates, we can also specify comparer f.e. StringComparer.CurrentCulture
.SelectMany(x => itemList
.Where(i => string.Equals(i.Name, x))) // it is better to use string.Equals, we can pass comparison as third argument f.e. StringComparison.CurrentCulture
.ToList();
string s = "item1|item2|item3|item4";
我认为不需要拆分此字符串 s
。所以你可以简单地做
var newList = itemList.Where(i => s.Contains(i.Name));
对于不同的越野车输入你也可以这样做
s = "|" + s + "|";
var newList = itemList.Where(o => s.Contains("|" + o.Name + '|')).ToList();
List<object> newList = itemList.Where(item => s.Split("|").Contains(item.Name)).ToList<object>();
我有一个带“|”的字符串分隔符:
string s = "item1|item2|item3|item4";
每个对象都有一个名称和值的列表:
//object
List<ItemObject> itemList = new List<ItemObject>();
itemList.Add(new ItemObject{Name="item0",Value=0});
itemList.Add(new ItemObject{Name="item1",Value=1});
//class
public class ItemObject(){
public string Name {get;set;}
public int Value {get;set;}
}
下面的代码在linq中如何在一行中完成?
var newList = new List<object>();
foreach (var item in s.Split("|"))
{
newList.Add(itemList.FirstOrDefault(x => x.Name == item));
}
// Result: newList
// {Name="item1",Value=1}
试试这个:
var newList = itemList.Where(item => s.Split('|').Contains(item.Name));
建议的解决方案还可以防止使用 null
中不存在的项目填充 newList
。您也可以考虑进行更严格的字符串相等性检查。
我建议从一开始就拆分字符串。通过这样做,我们不会在每次迭代期间拆分它:
List<ItemObject> newList = s
.Split("|")
.SelectMany(x => itemList.Where(i => i.Name == x))
.ToList();
甚至更好:
List<ItemObject> newList = s
.Split("|") // we can also pass second argument: StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
.Distinct() // remove possible duplicates, we can also specify comparer f.e. StringComparer.CurrentCulture
.SelectMany(x => itemList
.Where(i => string.Equals(i.Name, x))) // it is better to use string.Equals, we can pass comparison as third argument f.e. StringComparison.CurrentCulture
.ToList();
string s = "item1|item2|item3|item4";
我认为不需要拆分此字符串 s
。所以你可以简单地做
var newList = itemList.Where(i => s.Contains(i.Name));
对于不同的越野车输入你也可以这样做
s = "|" + s + "|";
var newList = itemList.Where(o => s.Contains("|" + o.Name + '|')).ToList();
List<object> newList = itemList.Where(item => s.Split("|").Contains(item.Name)).ToList<object>();