To LINQ or not to LINQ
Some notes:


I think the LINQ version would be more readable if you extracted a variable for the collection. Something like:

var serials = /* the whole LINQ query here */

Items.Clear();
Items.AddRange(serials);

The LINQ version might be more efficient if there were lots of widgets, because Intersect() uses hashing to achieve O(n+m) time complexity, while your imperative code is O(n·m).
You don't need ToArray() in your LINQ version. (Assuming Items is List&lt;string&gt;.)
I really don't think the string "No relevant widgets found." should be the default value if the list is empty. List of widget serial numbers should contain widget serial numbers, nothing else. And you should separate your business logic and presentation.


With the mentioned changes, I think the LINQ version will be more readable, primarily because Intersect() explains what you want to do better.

Also don't forget that you don't have to use only LINQ or only imperative code, you can combine the two in a single method (e.g. improve the imperative approach by using Intersect()).