繁体   English   中英

C#中的高级列表比较

[英]advanced list comparison in C#

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

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

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

另外如果你能解释这部分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接口的许多其他函数的含义,您必须了解 C# 中的惰性求值,而且要说的太多了。

ListResNeeded.Select(s => s.Name).ToList(); 和其他带有枚举器的操作从最后更容易阅读。 因此,从结尾:你犯了一个列表(是什么?)由生产要素的Select功能(这是什么生产?)它需要一个资源s ,并返回s.Name从它(其中在这些资源来自哪里?)列出 ListResNeeded。

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

PS 还有一些关于您尝试使用的代码的警告。 你在那里做什么:

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

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

在完全遍历前两个列表后,您会在那里创建一个新的(第三个)列表,而您实际寻找的只是一个布尔答案。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM