使用 LINQ 比较两个列表的更好方法?

发布于 2024-09-14 02:03:23 字数 427 浏览 8 评论 0原文

我有 2 个集合:

IEnumerable<Element> allElements
List<ElementId> someElements, 

一起执行以下操作的简洁方法是什么:

[1] 验证 someElements 中的所有元素是否存在于 allElements 中,当条件失败时快速返回。

[2] 获取

List所包含的 Element 对象列表。 someElements 映射到。

每个 Element 对象都有一个 ElementId

谢谢。

I have the 2 collections:

IEnumerable<Element> allElements
List<ElementId> someElements, 

What is a concise way of doing the following together:

[1] Verifying that all elements in someElements exist in allElements, return quickly when condition fails.

and

[2] Obtain a list of Element objects that List<ElementId> someElements maps to.

Every Element object has an ElementId

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

无尽的现实 2024-09-21 02:03:23

我会这样做:

var map = allElements.ToDictionary(x => x.Id);    
if (!someElements.All(id => map.ContainsKey(id))
{
    // Return early
}
var list = someElements.Select(x => map[x])
                       .ToList();

请注意,如果 allElements 中有任何重复项,第一行将引发异常。

I would do this:

var map = allElements.ToDictionary(x => x.Id);    
if (!someElements.All(id => map.ContainsKey(id))
{
    // Return early
}
var list = someElements.Select(x => map[x])
                       .ToList();

Note that the first line will throw an exception if there are any duplicates in allElements.

不必了 2024-09-21 02:03:23
  1. someElements.All(e => allElements.Contains(e));
  2. allElements.Where(e => someElements.Contains(e.ElementId));
  1. someElements.All(e => allElements.Contains(e));
  2. allElements.Where(e => someElements.Contains(e.ElementId));
谁把谁当真 2024-09-21 02:03:23

不如 Skeet 答案那么有效,但对于合理大小的集合来说已经足够了:

IEnumerable<Element> allElements = new List<Element>
    { new Element { Id = 1 }, new Element { Id = 2 } };
List<int> someElements = new List<int> { 1, 2 };

var query =
    (from element in allElements
    join id in someElements on element.Id equals id
    select element)
    .ToList();

if (query.Count != someElements.Count)
{
    Console.WriteLine("Not all items found.");
}

foreach (var element in query)
{
    Console.WriteLine ("Found: " + element.Id);
}

Not as efficient as the Skeet answer, but good enough for reasonable-sized collections:

IEnumerable<Element> allElements = new List<Element>
    { new Element { Id = 1 }, new Element { Id = 2 } };
List<int> someElements = new List<int> { 1, 2 };

var query =
    (from element in allElements
    join id in someElements on element.Id equals id
    select element)
    .ToList();

if (query.Count != someElements.Count)
{
    Console.WriteLine("Not all items found.");
}

foreach (var element in query)
{
    Console.WriteLine ("Found: " + element.Id);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文