list vclAsset<FullAsset>
list callsigns<string>
foreach(FullAsset fa in vclAsset)
{
if (callsigns.contains(fa.asset.callsign))
{
//do something
}
}
有更优雅的方式来做上述事情吗? FullAsset对象包含一个Asset对象,而该对象又有一个字符串“Callsign”。每个呼号都是唯一的,因此我的列表呼号只有每个字符串中的一个,并且没有两个FullAsset对象将共享一个Asset.callsign变量。
简而言之,我想拉出所有具有特定呼号的FullAssets,但使用foreach似乎很笨拙(假设可能包含在所述列表中的FullAssets的数量可能没有上限)。
答案 0 :(得分:3)
如果您的密钥是唯一的,则可以使用Dictionary或Hashtable来加快搜索速度。
如果您只想查找某个项目,可以使用List<T>.Find
方法并提供谓词。
FullAsset result = vclAsset.Find
(fa => callsigns.contains(fa.asset.callsign));
或
List<FullAsset> results = vclAsset.FindAll
(fa => callsigns.contains(fa.asset.callsign));
如果您使用.Net 3.5,LINQ Where可能是更好的解决方案,正如其他人所说,因为它返回枚举器(延迟评估)与完整列表。
答案 1 :(得分:3)
你可以使用lambda表达式,如下所示:
foreach(FullAsset fa in vclAsset.Where(a => callsigns.contains(a.asset.callsign))
{
// do something
}
答案 2 :(得分:2)
当然,使用linq。
var assets= vclAsset.Where(fullA=>allsigns.contains(fullA.asset.callsign));
资产将是一些可枚举的结构。
我可以推荐100 Linq samples来获取灵感和学习
答案 3 :(得分:0)
不确定它是否更优雅但你可以使用linq ......
var results = from fa in vclAsset
where callsigns.Contains(fa.asset.callsign)
select fa;
答案 4 :(得分:0)
var result = vclAsset.Where(x=>callsigns.Any(y=>x.asset.callsign==y));
P.S。我会重命名vclAsset
和asset
/ callsign
属性。
答案 5 :(得分:0)
您也可以使用Join功能执行此操作。
var sortedList = vclAsset.Join(callsigns,
x => x.asset.callsign, x => x,
x, y => x);
这是列出了呼号的vclAsset列表。