如何将两个不同的列表映射到一个列表?

时间:2016-06-30 12:46:13

标签: c# asp.net linq

我有两个通用类型AB列表:

public class A {
    int type;
    string params;
    bool isActive;
}

public class B {
    int type;
}

如何使用linq将它们映射到A类型列表中B.type == A.type(不是A.type == B.type !!)?

B的实例包含可以删除或添加的int值,而类A的实例包含来自我的数据库的值。

例如:

A[0] = {1, "11", true}, A[1] = {2, "22", true}, A[2] = {3, "33", false}

B = {2, 3}

所需结果包含A[1]A[2]

4 个答案:

答案 0 :(得分:3)

您想加入两个列表,请查找两个列表中的所有A吗?

var query = from a in aList
            join b in bList
            on a.type equals b.type
            select a;
List<A> resultList = query.ToList();

答案 1 :(得分:2)

听起来你的意思是“通过检查第二个列表中的属性来过滤第一个列表中的项目” - 在这种情况下,我建议:

  1. 从第二个列表构建索引:

    // create an index of the "type"s to look for
    var index = new HashSet<int>(bList.Select(x => x.type));
    
  2. 用它来过滤数据

    // filter the primary list to values from the index
    var matches = aList.FindAll(x => index.Contains(x.type));
    
  3. 这将非常有效地为您提供仅A中具有相应值的bList数据的列表。

    这里可以运行:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    class Program
    {
        public class A
        {
            public int type;
            public string @params;
            public bool isActive;
        }
    
        public class B
        {
            public int type;
        }
        static void Main()
        {
            var aList = new List<A>
            {
                new A { type = 1, @params = "11", isActive = true },
                new A { type = 2, @params = "22", isActive = true },
                new A { type = 3, @params = "33", isActive = false },
            };
            var bList = new List<B>
            {
                new B { type = 2 },
                new B { type = 3 },
            };
            // create an index of the "type"s to look for
            var index = new HashSet<int>(bList.Select(x => x.type));
    
            // filter the primary list to values from the index
            var matches = aList.FindAll(x => index.Contains(x.type));
    
            foreach (var match in matches)
            {
                Console.WriteLine($"{match.type}, {match.@params}, {match.isActive}");
            }
        }
    }
    

    带输出:

    2, 22, True
    3, 33, False
    

答案 2 :(得分:1)

这就是你要找的东西!?

var result = arrayA.Where(a => arrayB.Select(b => b.type).Contains(a.type)).ToArray();

答案 3 :(得分:0)

如果您有两个序列,其中两个序列都具有应匹配的值,并且您希望从第一个序列中获取零个或多个属性,并使用Enumerable.Join.

语法看起来有点困难,但如果经常使用,你会习惯它。

假设在您的示例中,您有一系列A对象和一系列B对象:

IEnumerable<A> myAobjects = ...
IEnumerable<B> myBobjects = ...

// do the join:
myAObjects.Join(myBobjects,  // join the two sequences
myAobject => myAobject.type, // from the A sequence take property type
myBobject => myBobject.type, // from the B sequence also take property type
(myAobject, myBobject) =>    // whenever the values of these properties equal, take:
 ...);

这些点将以myAobject和myBobject的组合形式存储,这些组合具有相同的属性类型值。您的问题很简单:只要myAobject.type与myBobject.type匹配,您就需要完整的myAObject。在这种情况下,连接的最后一部分是:

(myAobject, myBobject) => myAobject

如果你想要其他东西返回,你会使用类似的东西:

(myAobject, myBobject) => new
{
    MyParams = myAobject.Params,
    MyOtherValue = myBObject.type,
}