Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比使用foreach更好的搜索列表的方法 列出vclAsset 列出呼号 foreach(vClass中的FullAsset fa) { if(callsign.contains(fa.asset.callsign)) { //做点什么 } }_C#_.net_Linq_Foreach - Fatal编程技术网

C# 比使用foreach更好的搜索列表的方法 列出vclAsset 列出呼号 foreach(vClass中的FullAsset fa) { if(callsign.contains(fa.asset.callsign)) { //做点什么 } }

C# 比使用foreach更好的搜索列表的方法 列出vclAsset 列出呼号 foreach(vClass中的FullAsset fa) { if(callsign.contains(fa.asset.callsign)) { //做点什么 } },c#,.net,linq,foreach,C#,.net,Linq,Foreach,有没有一种更优雅的方式来实现上述目标?FullAsset对象包含一个Asset对象,而Asset对象又有一个字符串“Callsign”。每个Callsign都是唯一的,因此我的列表Callsign将只有一个字符串,并且没有两个FullAsset对象将共享一个Asset.Callsign变量 简而言之,我想提取所有具有特定呼号的FullAssets,但使用foreach似乎很笨拙(考虑到所述列表中可能包含的FullAssets的数量可能没有上限)。如果您的键是唯一的,您可以使用a或a来加快搜索速度

有没有一种更优雅的方式来实现上述目标?FullAsset对象包含一个Asset对象,而Asset对象又有一个字符串“Callsign”。每个Callsign都是唯一的,因此我的列表Callsign将只有一个字符串,并且没有两个FullAsset对象将共享一个Asset.Callsign变量


简而言之,我想提取所有具有特定呼号的FullAssets,但使用foreach似乎很笨拙(考虑到所述列表中可能包含的FullAssets的数量可能没有上限)。

如果您的键是唯一的,您可以使用a或a来加快搜索速度

如果只想查找某个项目,可以使用该方法并提供谓词

list vclAsset<FullAsset>
list callsigns<string>

foreach(FullAsset fa in vclAsset)
{
    if (callsigns.contains(fa.asset.callsign))
    {
         //do something
    }

}

List results=vclAsset.FindAll
(fa=>callsign.contains(fa.asset.callsign));

如果您使用的是.Net 3.5,正如其他人所说,LINQ可能是一个更好的解决方案,因为它返回一个枚举数(惰性计算)而不是一个完整的列表。

您可以使用lambda表达式,如下所示:

List<FullAsset> results = vclAsset.FindAll
     (fa => callsigns.contains(fa.asset.callsign));
当然,使用linq

foreach(FullAsset fa in vclAsset.Where(a => callsigns.contains(a.asset.callsign))
{
    // do something
}
资产将是一些可枚举的结构


我可以推荐灵感和学习

不确定它是否更优雅,但你可以使用linq

var assets=    vclAsset.Where(fullA=>allsigns.contains(fullA.asset.callsign));

另外,我将重命名
vclAsset
asset
/
callsign
属性。

您也可以使用连接功能来完成此操作

var result = vclAsset.Where(x=>callsigns.Any(y=>x.asset.callsign==y));

这是具有列出的呼号的vClass列表。

+1。你跑得更快。。。我已经删除了我的答案。(它是==你的)。更好,但主要是语法方面的。你也可以使用List.FindAll并提供谓词。实际上我认为在下面。FindAll可能会使用ForEach,但看起来更简洁:-)当然,整个Linq都会这样做,但重点是避免一直重复ForEach语句,并关注条件(谓词、比较等)。LINQ to Objects与IEnumerable一起工作。涉及的表达式树为零。没有惰性计算。如果我错了-欢迎修复!:)我不是指表达式树,而是指
FindAll
在完全实例化的列表上工作,并返回完整的元素列表,当
Where
一次检查一个元素时,每次迭代都会返回一个结果。例如,如果在
foreach
循环中有一个
break
语句,它可能永远不会访问原始枚举中的所有元素。或者,如果您使用
Select
语句来投影
Where
结果,那么差异会更大,因为您一次只投影一个项目。+1-与我在语法上使用的答案类似(如果我们可以接受两个!)-是性能上存在差异,还是纯粹的美学变化?。非常感谢linq的例子!当另一个答案到达时,我已经输入了一半的答案。我只是想添加一个链接,当我第一次探索Linq时,这个链接确实帮助了我。
        var results = from fa in vclAsset
                      where callsigns.Contains(fa.asset.callsign)
                      select fa;
var result = vclAsset.Where(x=>callsigns.Any(y=>x.asset.callsign==y));
var sortedList = vclAsset.Join(callsigns,
    x => x.asset.callsign, x => x,
    x, y => x);