首页 > 解决方案 > 加入两个列表并检查匹配的属性值并返回所需的数据

问题描述

我有两个列表,我想比较使用 fn_cds(List1) 和 fnctn_cd (List2) 的两个列表,并从 List2 表中获取“fn_desc”。其中List1 的'fn_cds' 属于字符串[],即表中一行中的数据将类似于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”。

标签: c#linq

解决方案


试试这个(为简单起见,我已将您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 并重新构建你的类,你可能会有一个更好的构造。


推荐阅读