如何将列表类型的对象与列表类型int进行比较

时间:2016-07-19 15:01:48

标签: c# linq lambda

我试图将两个列表与Linq或lambda表达式进行比较。我不想使用任何类型的循环。

如果我有两个整数列表类型,我会使用这个表达式

示例1

List<int> tlistA = new List<int>();
tlistA.AddRange(new int[] { 1, 2, 3, 4, 5 });

List<int> tlistB = new List<int>();  
tlistB.AddRange(new int[] { 3, 5, 6, 7, 8 });


     Console.WriteLine((from   tla in tlistA
                        where  tlistB.Contains(tla)
                        select tla).Any());

但是,如果我同时拥有列表类型的对象,我会使用这个表达式

示例2

   class la{public int v { get; set; }}
    class lb{public int v { get; set; }}

    static void Main(string[] args)
    {
        List<la> listA = new List<la>
        {
            new la() { v  =  1 },
            new la() { v  =  2 },
            new la() { v  =  3 },
            new la() { v  =  4 },
            new la() { v  =  5 },
        };
        List<lb> listB = new List<lb>
        {
            new lb() { v  =  3 },
            new lb() { v  =  5 },
            new lb() { v  =  6 },
            new lb() { v  =  7 },
            new lb() { v  =  8 },
        };


        Console.WriteLine(listB
            .Where(b =>
            listA
            .Any(a => a.v == b.v))
            .Any());
    }

但是,我的问题是如何将整数的列表类型与具有整数属性的另一个列表类型的对象进行比较。

让我的问题清楚地理解&#34;我如何将示例1中的tlistA与示例2中的listB进行比较?&#34;

非常感谢

3 个答案:

答案 0 :(得分:3)

最有效的方法不是 public void run() { byte[] buffer; // buffer store for the stream int bytes; // bytes returned from read() // Keep listening to the InputStream until an exception occurs while (true) { try { buffer = new byte[1024]; // Read from the InputStream bytes = inStream.read(buffer); status.post(new Runnable() { public void run() { status.setText("Receiving "+progress+ " / "+total); } }); // Send the obtained bytes to the UI activity mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer) .sendToTarget(); } catch (IOException e) { break; } } } private static Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch(msg.what){ case Constants.MESSAGE_READ: byte[] readBuf = (byte[])msg.obj; String string = new String(readBuf); received.add(string); if(progress < 1) { total = 100; } progress++; if(progress == 15) { for(int i = 0; i < received.size(); i++) { System.out.println(received.get(i)); } } break; } } }; + Where + Contains,而是Any + Intersect

Any

关键是您已从对象中选择bool intsContainV = tlistA.Intersect(listB.Select(b => b.v)).Any(); 属性以在int中使用它。

所以你也可以使用你的(慢)Intersect - Where - 方法:

Contains

或更短:

bool intsContainV = tlistA
    .Where(i => listB.Select(b => b.v).Contains(i))
    .Any(); 

答案 1 :(得分:1)

absolute

position: fixed

实质上,您需要将tlistA.Where(x => listB.Select(y => y.v).Contains(x)).Any(); 转换为整数列表,并由此完成 tListA.Intersect(listB.Select(y => y.v)).Any(); 一旦它是一个整数列表,你可以通过你想要的任何方法自由地比较你的整数列表。

答案 2 :(得分:0)

listA.Where(lstA => listB.Any(lstB.Contains(lstA)))