【解決方法】list2のすべての項目がlist1に存在することを確認したい


C#
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.

理由をお見せしましょう:

C#
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

為に IntersectExcept、追加のチェックが必要です:

C#
itemsA.Count == itemsB.Count && count == itemsA.Count

アップデート

要望通り、 SequenceEqual 拡張メソッドとして:

C#
// 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 つの異なるリストの比較:

C#
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 番目のコレクションと同じ数の要素がある場合、最初のコレクションはスーパーセットです。

コメント

タイトルとURLをコピーしました