加入两个列表并检查匹配的属性值并返回所需的数据

时间:2019-05-07 06:07:22

标签: c# linq

我有两个列表,我想使用fn_cds(List1)和fnctn_cd(List2)比较两个列表,并从List2表中获取'fn_desc'。如果List1的'fn_cds'是string [],则表中一行中的数据将类似于ex {fn1,fn2,fn3}。 数据'fnctn_cd'将出现在表中的是字符串类型,即第一行中的fn1,第二行中的fn2等。我想将这两个列表与List1的fn_cds与List2的'fnctn_cd'进行比较,并获得与匹配的'fnctn_cd'对应的'fn_desc'。

public class List1
{
  public string[] fn_cds { get; set; }
  public string fn_desc { get; set; }
  public List<List2> List2{ get; set; }
}
public class List2
{
  public string fnctn_cd { get; set; }
  public string fn_desc { get; set; }
}
public ActionResult Index()
{
  List<List1> list1= new List<List1>();
  List<List2> list2= new List<List2>();

   IEnumerable<List1> model = userGroupRepository.GetAllUserGroup().Select(o => new List1
                {
                    fn_cds = o.fn_cds,
                    fn_desc = o.fn_desc
                });
                list1 = model.ToList();

   IEnumerable<List2> model1 = userGroupRepository.GetAllFunctions().Select(o => new List2
                {
                    fnctn_cd = o.fnctn_cd,
                    fn_desc = o.fn_desc
                });
                list2 = model1.ToList();
}

我尝试遍历如下所示的两个列表,但没有得到预期的结果。

for(var i = 0; i < list1.Count; i++)
            {
                if(list1[i].fn_cds.Contains(list2.Any(o => o.fnctn_cd)))
                {
                    list1[i].fn_desc = list2[i].fn_desc;
                }
            }
  

样本表结构

Table1(list1)          Table2(list2)
----------------       -------------------------
fn_cds                  functn_cd  | fn_desc
---------------        -------------------------
{fn1,fn2,fn3}           fn1        | function1
{fn1,fn2}               fn2        | function2
{fn3}                   fn3        | function3

基于与fnctn_cd(来自list2)匹配的fn_cds [](来自list1),我的预期结果应该从list2返回list1中的'fn_desc'。

1 个答案:

答案 0 :(得分:1)

尝试一下(为简单起见,我将您的List<List1>更改为List<string>

        List<string> model = new List<string> { {"fn1,fn2"}, {"fn1"} };
        List<List2> lookup = new List<List2> 
                         {
                          new List2 {fn_desc = "Fist", fnctn_cd = "fn1"}, 
                          new List2 {fnctn_cd = "fn2", fn_desc = "Second"} 
                         };

     var result = model.Select(x => x.Split(',')
        .Select(x1 => lookup.Where(l => l.fnctn_cd == x1).Select(l => l.fn_desc).FirstOrDefault())
                    .ToList()).ToList();

这看起来很丑陋,但感觉像是一个hack,我认为如果将List2更改为Dictionary并重新构建类,则可能会具有更好的构造。