gpt4 book ai didi

c# - C# 中的 Scala flatMap.toMap 类似物

转载 作者:行者123 更新时间:2023-11-30 15:39:42 25 4
gpt4 key购买 nike

前几天我在用 C# 编写一些代码来获取一个对象列表,每个对象都包含一个数组字段,并将其转换为一个映射(即字典),其中对象成为值,对象数组的每个元素领域成为关键。这可能没有多大意义,所以让我们展示一些代码。在 Scala 中,我可能会这样做:

// Data class
class MyClass(val keys:Array[String])

object MyClassTests {

// Dummy method just to get some sample data
def getMyClassList() = List(
new MyClass(Array("one", "two", "three")),
new MyClass(Array("four", "five", "six")))


def test() = {
val list = getMyClassList()
val map1 = list.view.flatMap(mc => mc.keys.map(_ -> mc)).toMap
// or, if you like for-comprehensions:
val map2 = (for (mc <- list.view; k <- mc.keys) yield k -> mc).toMap
map1 // or map2, same difference
}
}

在 REPL 中运行它,给我们(添加了格式):

res0: scala.collection.immutable.Map[String,MyClass] = 
Map(four -> MyClass@4ee31ef2,
three -> MyClass@69bc6271,
two -> MyClass@69bc6271,
six -> MyClass@4ee31ef2,
five -> MyClass@4ee31ef2,
one -> MyClass@69bc6271)

但是,我不想在 Scala 中执行此操作,我想在 C# 中执行此操作。下面介绍了两种可能的解决方案,Test1() 是一种非常命令式的解决方案,而 Test2() 是我当场想到的最接近的类比。

所以我的问题是:忽略这个例子看似空洞的事实,Test2() 真的是最接近 Scala 代码的模拟吗?它是在C#?是否有更简洁的方法来完成相同的任务(在 C# 中)?

// Data class
class MyClass {
public string[] Keys { get; set; }

}

class MyClassTests {
// Dummy method just to get some sample data
public static IList<MyClass> GetMyClassList() {
return new List<MyClass> {
new MyClass {
Keys = new[] {"one", "two", "three"}
},
new MyClass {
Keys = new[] {"four", "five", "six"}
}
};
}

public void Test1() {
var list = GetMyClassList();
var validTypes = new Dictionary<string, MyClass>();
foreach (var h in list) {
foreach (var key in h.Keys)
validTypes.Add(key, h);
}
}

public void Test2() {
var list = GetMyClassList();
var validPartTypes = list
.SelectMany(mc => mc.Keys.Select(k => new KeyValuePair<string,MyClass>(k, mc)))
.ToDictionary(x => x.Key, x => x.Value);
}
}

最佳答案

您可以使用匿名类型代替 KeyValuePair<>使它更简洁:

var validPartTypes = list.SelectMany(mc => mc.Keys.Select(k => new { k, mc }))
.ToDictionary(x => x.k, x => x.mc);

或者,如果你觉得 LINQ 查询语法更清晰,那就是:

var validPartTypes = (from mc in list
from k in mc.Keys
select new { k, mc })
.ToDictionary(x => x.k, x => x.mc);

但是您的代码是完全有效的,我看不出有任何更好的方法可以在 C# 中实现这一点。

关于c# - C# 中的 Scala flatMap.toMap 类似物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10052847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com