c# - C# 中的高级列表比较

标签 c# list lambda

我开始比较我的小项目的列表。到目前为止,我可以比较是否存在相同的项目,或者该项目的一个值是否适合另一个列表项目的相同值。 Atm 我正在比较两个列表中的名字。我出于我的目的更改了一些找到的代码。

public class TestResources
{
     public string Name;
     public int Amount;

     public TestResources(string name, int amount)
     {
          Name = name;
          Amount = amount;
     }
}

TestResources[] ListResInStock = { new TestResources("wood", 1000), new TestResources("stone", 1000), new TestResources("sand", 1000), new TestResources("water", 1000) };
TestResources[] ListResNeeded = { new TestResources("wood", 800), new TestResources("stone", 800), new TestResources("sand", 375) };

private bool ContainsResourceName(IEnumerable<TestResources> ListResNeeded, IEnumerable<TestResources> ListResInStock)
{
     bool result;

     var list1WithName = ListResNeeded.Select(s => s.Name).ToList();
     var list2WithName = ListResInStock.Select(s => s.Name).ToList();

     result = !list1WithName.Except(list2WithName).Any();

     return result;
}

该函数的调用方式为:

Console.WriteLine("ListResInStock contains ListResNeeded:   ===> " + ContainsResourceName(ListResNeeded, ListResInStock) + " <===");    // True
Console.WriteLine("ListResNeeded contains ListResInStock:   ===> " + ContainsResourceName(ListResInStock, ListResNeeded) + " <===");    // False

现在我想更改它,以便仅当 ressNeeded 的名称存在且 ressInStock 的数量 >= RessNeeded 的数量(当然对于所有资源)时才返回 true。

另外,如果你可以解释这部分var list1WithName = ListResNeeded.Select(s => s.Name).ToList();对我来说详细一点会很好,因为我不是100%确定什么确实如此。

我真的很感谢你的帮助:-)

最佳答案

很简单

private bool ContainsResourceName(IEnumerable<TestResources> ListResNeeded, IEnumerable<TestResources> ListResInStock)
{
     return ListResNeeded.All(resNeeded => 
         ListResInStock.Any(resInStock => 
              resInStock.Name == resNeeded.Name && 
              resInStock.Amount >= resNeeded.Amount
         )
     );
}

理解.Select.All.First以及许多其他所谓的IEnumerable函数的含义code> 接口(interface),你就必须学习 C# 中的惰性求值,而且有太多要说的了。

ListResNeeded.Select(s => s.Name).ToList(); 和其他带有枚举器的操作更容易从末尾读取。因此,从最后开始:您创建一个由 Select 函数生成的元素列表(什么?)(它会生成什么?)它需要一个资源 s 并返回 s.Name(这些资源从哪里来?)来自 ListResNeeded 列表。

同样,您必须阅读有关 C# 中的 IEnumerator 以及一般惰性求值的更多信息。这是编程中的一个重要概念。

附注以及有关您尝试使用的代码的一些警告。你在那里做什么:

var list1WithName = ListResNeeded.Select(s => s.Name).ToList();
var list2WithName = ListResInStock.Select(s => s.Name).ToList();

正在完整复制传递给函数的两个参数(想象一下这些数组会大得多,复制它们有什么意义?)。

在完全遍历完前两个列表后,您将创建一个(第三个)列表,而您实际寻找的只是一个 bool 答案。

result = !list1WithName.Except(list2WithName).Any();

在知道答案为假之前,您不必完全遍历这两个列表。您只需找到缺少的第一个资源,然后停止搜索(这样要轻得多)

关于c# - C# 中的高级列表比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60800388/

相关文章:

javascript - node async 仅在 node-lambda 内部调用第一个函数

c# - 匹配一个字符串,直到它遇到一个 '('

c# - 合并2个foreach循环(删除具有特定扩展名的文件)

list - 将 M 维列表转换为一维

c# - 通用 LINQ orderby lambda 函数

c# - 用于遍历数组的 lambda 表达式

c# - 如何在 C# 中执行表 SP

c# - 标记为 Content -> Copy Always 的文件未被复制

windows - 命令提示符 : dir file whose File size is greater than 1024KB

c# - 如何创建列表<编译时未知类型>并通过 System.Reflection.PropertyInfo 复制项目