var subset = new[] { 9, 3, 9 };
var superset = new[] { 9, 10, 5, 3, 3, 3 };
subset.All(s => superset.Contains(s))
這段代碼將回傳 true,因為 9 包含在超集中,但只有一次,我想要一個考慮到重復項的實作,所以它會回傳 false
uj5u.com熱心網友回復:
我的想法是您可以按計數對兩組進行分組,然后測驗超級組串列是否包含子組串列中的每個鍵,并且在每種情況下,超級計數都大于或等于相應的子計數。我認為我已經通過以下方式實作了這一目標:
var subset = new[] { 9, 3, 9 };
var superset = new[] { 9, 10, 5, 3, 3, 3 };
var subGroups = subset.GroupBy(n => n).ToArray();
var superGroups = superset.GroupBy(n => n).ToArray();
var basicResult = subset.All(n => superset.Contains(n));
var advancedResult = subGroups.All(subg => superGroups.Any(supg => subg.Key == supg.Key && subg.Count() <= supg.Count()));
Console.WriteLine(basicResult);
Console.WriteLine(advancedResult);
我做了一些額外的測驗,它似乎有效,但你可以測驗一些額外的資料集來確定。
uj5u.com熱心網友回復:
這是另一個解決方案:
var subset = new[] { 9, 3, 9 };
var superset = new[] { 9, 10, 5, 3, 3, 3 };
var subsetGroup = subset.GroupBy(x => x).Select(x => new { key = x.Key, count = x.Count() });
var supersetDict = superset.GroupBy(x => x).ToDictionary(x => x.Key, y => y.Count());
Boolean results = subsetGroup.All(x => supersetDict[x.key] >= x.count);
uj5u.com熱心網友回復:
這對我有用:
var subsetLookup = subset.ToLookup(x => x);
var supersetLookup = superset.ToLookup(x => x);
bool flag =
subsetLookup
.All(x => supersetLookup[x.Key].Count() >= subsetLookup[x.Key].Count());
uj5u.com熱心網友回復:
這不是集合和集合操作的作業方式。集合不能包含重復項。
您不應將這兩個陣列視為集合,而應視為(無序)序列。一種可能的演算法是:從序列中創建一個串列superset,然后從串列中一個一個地洗掉序列中的每個元素,subset直到您無法在串列中找到這樣的元素。
bool IsSubList(IEnumerable<int> sub, IEnumerable<int> super)
{
var list = super.ToList();
foreach (var item in sub)
{
if (!list.Remove(item))
return false; // not found in list, so sub is not a "sub-list" of super
}
return true; // all elements of sub were found in super
}
var subset = new[] { 9, 3 };
var superset = new[] { 9, 10, 5, 3,1, 3, 3 };
var isSubSet = IsSubList(subset, superset);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510630.html
標籤:C#林克
