Compare dos listas a través de una propiedad usando LINQ

Digamos que tengo lo siguiente:

    class Widget1{
        public int TypeID { get; set; }
        public string Color { get; set; }
    }

    class Widget2
    {
        public int TypeID { get; set; }
        public string Brand { get; set; }
    }

    private void test()
    {
        List<Widget1> widgets1 = new List<Widget1>();
        List<Widget2> widgets2 = new List<Widget2>();
        List<Widget1> widgets1_in_widgets2 = new List<Widget1>();

        //some code here to populate widgets1 and widgets2

        foreach (Widget1 w1 in widgets1)
        {
            foreach (Widget2 w2 in widgets2)
            {
                if (w1.TypeID == w2.TypeID)
                {
                    widgets1_in_widgets2.Add(w1);
                }
            }
        }
    }

Estoy usando dos bucles foreach para comparar las listas por TypeID para completar una tercera lista. ¿Hay alguna otra forma de usar LINQ para comparar estas dos listas a través del TypeID? ¿Quizás usando Interstect o alguna otra función?

Respuestas a la pregunta(5)

Su respuesta a la pregunta