2012-06-24 257 views
0

关于在嵌套类中搜索记录的问题。这是我的代码的减少版本。希望它足够解释!我正在使用Visual Web Developer 2010 Express。搜索嵌套类列表

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace API 
{ 
    public class Fixture 
    { 
     public int ID { get; set; } 
     public string Description { get; set; } 
     public List<FixturesMarketData> FixturesMarketData; 

     public Fixture() 
     { 
      FixturesMarketData = new List<FixturesMarketData>(); 
     } 

     public void AddMarket(int _fixtureID, int _marketID, string _MarketName) 
     { 
      FixturesMarketData.Add(new FixturesMarketData (_fixtureID, _marketID, _MarketName)); 
     } 

     public string ListMarkets() 
     { 
      string strReturn=""; 
      foreach (var item in FixturesMarketData) 
      { 
       strReturn = strReturn + "<br />" + item.marketDescription + " - " + item.marketID + " - " + item.fixtureID; 
      } 
      return strReturn; 
     } 
    } 

    public class FixturesMarketData 
    { 
     public int fixtureID { get; set; } 
     public int marketID { get; set; } 
     public string marketDescription { get; set; } 

     public FixturesMarketData(int _mdfixtureID, int _mdmarketID, string _mdmarketDescription) 
     { 
      fixtureID = _mdfixtureID; 
      marketID = _mdmarketID; 
      marketDescription = _mdmarketDescription; 
     } 
    } 
} 

主代码

_fixtures = new List<Fixture>(); 
_fixtures.Add(new Fixture { ID = 1234, Description = 'This is a test' }); 

int index = _fixtures.FindIndex(Fixture => Fixture.ID.Equals(1234)); 
_fixtures[index].AddMarket(1234, 5678, 'This is a test market'); 
AddToOutputString(_fixtures[index].ListMarkets()); 

所以基本上这将导致: 夹具:

ID= 1234; 
Description=This is a test; 
FixturesMarketData 
FixtureID=1234; 
MarketID=5678; 
marketDescription=This is a test market; 

我如何做一个找到FixturesMarketData为地方市场ID等于5678?

我能做到这一点是这样的:

var index=-1; 
      foreach (var item in _fixtures) 
      { 
       index = item.FixturesMarketData.FindIndex(entry => entry.marketID.Equals(_marketId)); 
       if(index!=-1) 
       { 
        break; 
       } 
      } 

但我猜一定有办法做到这一点在LAMBDA查找风格

谢谢!

+0

请参阅[我的答案](http://stackoverflow.com/a/11117930/201088) –

回答

1
var enumerable=_fixtures.Where(x=>x.FixturesMarketData.Any(x=>x.marketId==5678)); 
现在,如果你希望找到很多这样的灯具可以做

enumerable.ToList(); 

,如果你想只有第一个

enumerable.FirstOrDefault(); 

,如果只有一个夹具可随后发现

enumerable.SingleOrDefault(); 

注意:这里默认意味着如果没有找到返回NULL否则会出现错误

+0

完美。非常感谢。正是我需要的! –