using System;
using System.Linq;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
List<string> l1 = new List<string> { "abc", "abc", "abc", "def" };
List<string> l2 = new List<string> { "abc" };
// Make word counts for l1 and l2
var c1 = l1.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count());
var c2 = l2.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count());
// Make a count of the difference between the two
var diff = new Dictionary<string,int>();
foreach (var p in c1) {
int sub;
if (!c2.TryGetValue(p.Key, out sub)) {
sub = 0;
}
diff[p.Key] = p.Value - sub;
}
// Reconstruct the result from counts
var res = diff.SelectMany(p => Enumerable.Repeat(p.Key, p.Value)).ToList();
foreach (var s in res) {
Console.WriteLine(s);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7Ckxpc3Q8c3RyaW5nPiBsMSA9IG5ldyBMaXN0PHN0cmluZz4geyAiYWJjIiwgImFiYyIsICJhYmMiLCAiZGVmIiB9OwpMaXN0PHN0cmluZz4gbDIgPSBuZXcgTGlzdDxzdHJpbmc+IHsgImFiYyIgfTsKLy8gTWFrZSB3b3JkIGNvdW50cyBmb3IgbDEgYW5kIGwyCnZhciBjMSA9IGwxLkdyb3VwQnkoeCA9PiB4KS5Ub0RpY3Rpb25hcnkoZyA9PiBnLktleSwgZyA9PiBnLkNvdW50KCkpOwp2YXIgYzIgPSBsMi5Hcm91cEJ5KHggPT4geCkuVG9EaWN0aW9uYXJ5KGcgPT4gZy5LZXksIGcgPT4gZy5Db3VudCgpKTsKLy8gTWFrZSBhIGNvdW50IG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3bwp2YXIgZGlmZiA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZyxpbnQ+KCk7CmZvcmVhY2ggKHZhciBwIGluIGMxKSB7CiAgICBpbnQgc3ViOwogICAgaWYgKCFjMi5UcnlHZXRWYWx1ZShwLktleSwgb3V0IHN1YikpIHsKICAgICAgICBzdWIgPSAwOwogICAgfQogICAgZGlmZltwLktleV0gPSBwLlZhbHVlIC0gc3ViOwp9Ci8vIFJlY29uc3RydWN0IHRoZSByZXN1bHQgZnJvbSBjb3VudHMKdmFyIHJlcyA9IGRpZmYuU2VsZWN0TWFueShwID0+IEVudW1lcmFibGUuUmVwZWF0KHAuS2V5LCBwLlZhbHVlKSkuVG9MaXN0KCk7CmZvcmVhY2ggKHZhciBzIGluIHJlcykgewoJQ29uc29sZS5Xcml0ZUxpbmUocyk7Cn0KCX0KfQ==