一种实现的方法是同时包含索引,例如:
var result = arrayOne.Select((r, i) => new {Value = r, Index = i})
.Except(arrayTwo.Select((r, i) => new {Value = r, Index = i}))
.Select(t => t.Value);
这将为您的输入提供所需的输出,但上述方法的问题是,不同索引上的相同字符串将被视为不同。
忽略索引的另一种方法可以像这样完成:
string[] arrayOne = { "One", "Two", "Three", "Three", "Three", "X" };
string[] arrayTwo = { "One", "Two", "Three" };
var query1 = arrayOne.GroupBy(r => r)
.Select(grp => new
{
Value = grp.Key,
Count = grp.Count(),
});
var query2 = arrayTwo.GroupBy(r => r)
.Select(grp => new
{
Value = grp.Key,
Count = grp.Count(),
});
var result = query1.Select(r => r.Value).Except(query2.Select(r => r.Value)).ToList();
var matchedButdiffferentCount = from r1 in query1
join r2 in query2 on r1.Value equals r2.Value
where r1.Count > r2.Count
select Enumerable.Repeat(r1.Value, r1.Count - r2.Count);
result.AddRange(matchedButdiffferentCount.SelectMany(r=> r));
result
将包含{"X", "Three", "Three"}
{"One", "Two", "Three", "Three"}
? - spenderstring[] arrayTwo = {"Two", "Three", "Three", "One"};
,如果有,是否会过滤掉arrayOne
中的 "One"。但 Habib 的方法并未这样做。 - spender