[ad_1]
bool Issuboption = option.SubProductOptions.ToList().All(s => getsuboptions.ToList().All(p => p.Id == s.Id));
option.SubProductOptions – これは 1 つのリストです
getsuboptions -これは別のリストです
どちらも同じタイプのオブジェクトと同じアイテムを両方のリストに持っていますが、使用してチェックしながらプログラムで IDの 上記のステートメントで。 私は得た 間違い ブール値。 実際には必要になります 真実
何か間違っている場合は修正してください。
私を助けてください
ありがとう
私が試したこと:
どちらも同じタイプのオブジェクトと同じアイテムを両方のリストに持っていますが、使用してチェックしながらプログラムで IDの 上記のステートメントで。 私は得た 間違い ブール値。 実際には True を取得します
解決策 2
2 つのリストが等しいかどうかを判断するには、次のいずれかを使用します。 SequenceEqual
また Union
.
理由をお見せしましょう:
List<Item> itemsA = new(); List<Item> itemsB = new(); for (int i = 0; i < 10; i++) { itemsA.Add(new Item(i, $"item {i}")); } itemsB = itemsA.OrderBy(x => Guid.NewGuid()).ToList(); // SequenceEqual method Console.WriteLine("SequenceEqual method"); var AreEqual = Enumerable.SequenceEqual(itemsA.OrderBy(e => e.Id), itemsB.OrderBy(e => e.Id)); Console.WriteLine($"Are Equal = {AreEqual}"); itemsB.Add(new(11, "imposter")); AreEqual = Enumerable.SequenceEqual(itemsA.OrderBy(e => e.Id), itemsB.OrderBy(e => e.Id)); Console.WriteLine($"Are Equal = {AreEqual}"); Console.WriteLine(); // Intersect method Console.WriteLine("Intersect method"); itemsB = itemsA.OrderBy(x => Guid.NewGuid()).ToList(); int count = itemsA.Select(item => item.Id).Intersect(itemsB.Select(item => item.Id)).Count(); Console.WriteLine($"Are Equal = {count == itemsA.Count}"); itemsB.Add(new(11, "imposter")); count = itemsA.Select(item => item.Id).Intersect(itemsB.Select(item => item.Id)).Count(); Console.WriteLine($"Are Equal = {count == itemsA.Count}"); Console.WriteLine(); // Union method Console.WriteLine("Union method"); itemsB = itemsA.OrderBy(x => Guid.NewGuid()).ToList(); count = itemsA.Select(item => item.Id).Union(itemsB.Select(item => item.Id)).Count(); Console.WriteLine($"Are Equal = {count == itemsA.Count}"); itemsB.Add(new(11, "imposter")); count = itemsA.Select(item => item.Id).Union(itemsB.Select(item => item.Id)).Count(); Console.WriteLine($"Are Equal = {count == itemsA.Count}"); Console.WriteLine(); // Except method Console.WriteLine("Except method"); itemsB = itemsA.OrderBy(x => Guid.NewGuid()).ToList(); count = itemsA.Select(item => item.Id).Except(itemsB.Select(item => item.Id)).Count(); Console.WriteLine($"Are Equal = {count == 0}"); itemsB.Add(new(11, "imposter")); count = itemsA.Select(item => item.Id).Except(itemsB.Select(item => item.Id)).Count(); Console.WriteLine($"Are Equal = {count == 0}"); // mock class record Item(int Id, string Name);
そして出力:
SequenceEqual method Are Equal = True Are Equal = False Intersect method Are Equal = True Are Equal = True Union method Are Equal = True Are Equal = False Except method Are Equal = True Are Equal = True
為に Intersect
と Except
、追加のチェックが必要です:
itemsA.Count == itemsB.Count && count == itemsA.Count
アップデート
要望通り、 SequenceEqual
拡張メソッドとして:
// extension method Console.WriteLine("extension method"); itemsB = itemsA.OrderBy(x => Guid.NewGuid()).ToList(); Console.WriteLine($"Are Equal = {itemsA.Eqaulity(itemsB)}"); itemsB.Add(new(11, "imposter")); Console.WriteLine($"Are Equal = {itemsA.Eqaulity(itemsB)}"); public static class ItemCompareExtension { public static bool Eqaulity(this List<Item> itemsA, List<Item> itemsB) => Enumerable.SequenceEqual(itemsA.OrderBy(e => e.Id), itemsB.OrderBy(e => e.Id)); } // mock class public record Item(int Id, string Name);
出力:
extension method Are Equal = True Are Equal = False
更新 #2
2 つの異なるリストの比較:
List<Item> itemsA = new(); List<Item> itemsB = new(); for (int i = 0; i < 10; i++) { itemsA.Add(new Item(i, $"item a {i}")); } for (int i = 0; i < 10; i++) { itemsB.Add(new Item(i, $"item b {i}")); } Console.WriteLine("extension method"); itemsB = itemsA.OrderBy(x => Guid.NewGuid()).ToList(); Console.WriteLine($"Are Equal = {itemsA.Eqaulity(itemsB)}"); itemsB.Add(new(11, "imposter")); Console.WriteLine($"Are Equal = {itemsA.Eqaulity(itemsB)}");
出力:
extension method Are Equal = True Are Equal = False
解決策 1
All はソースのすべての要素をチェックします。したがって、ListA が ListB のスーパーセットである場合は、返されます。 false
.
ListB が ListA のサブセットであるかどうかを知りたい場合は、 Intersect
代わりは: Enumerable.Intersect メソッド (System.Linq) | マイクロソフト ラーン[^] 例に示すように、カスタム IEquatable を使用します。
2 つのコレクションの共通部分に 2 番目のコレクションと同じ数の要素がある場合、最初のコレクションはスーパーセットです。
[ad_2]
コメント