搜索列表比使用foreach更好的方式

时间:2009-12-01 12:16:41

标签: c# .net linq foreach

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的数量可能没有上限)。

6 个答案:

答案 0 :(得分:3)

如果您的密钥是唯一的,则可以使用DictionaryHashtable来加快搜索速度。

如果您只想查找某个项目,可以使用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。我会重命名vclAssetasset / callsign属性。

答案 5 :(得分:0)

您也可以使用Join功能执行此操作。

var sortedList = vclAsset.Join(callsigns,
    x => x.asset.callsign, x => x,
    x, y => x);

这是列出了呼号的vclAsset列表。