使用LINQ将对象集合转换为字典

4

我有一个对象集合的列表如下。

column1:
Point data type
x=10,y=20

我使用 linq ofType<Point> 过滤了 Point 列。

Var XYLocations = Source.Select(g => g.ofType<Point>).ToList();

现在XYLocations中包含重复项。

我想使用linq从该列表中将其转换为dictionary<Point,List<int>>,其中点是键值,相应的匹配行索引作为值。


6
请注意,您可以通过将文本缩进四个空格来将行格式化为代码。编辑器工具栏中的“{}”按钮可切换缩进。对于内联代码,请使用反引号(“`”)。编辑您的问题并尝试一下。单击编辑器工具栏中的橙色问号,以获取有关格式设置的更多信息和提示。 - outis
1个回答

6

试试这样做:

var xyLocations = //initialization
var dictionary = xyLocations
                     .Select((p, i) => new Tuple<Point, int>(p, i))
                     .GroupBy(tp => tp.Item1, tp => tp.Item2)
                     .ToDictionary(gr => gr.Key, gr => gr.ToList());

如果您没有元组,可以使用匿名类型代替:
var dictionary = xyLocations
                     .Select((p, i) => new {Item1 = p, Item2 = i})
                     .GroupBy(tp => tp.Item1, tp => tp.Item2)
                     .ToDictionary(gr => gr.Key, gr => gr.ToList());

谢谢您的回答。但我没有使用 .Net 4.0,只使用了3.5版本。因此元组是不可用的。您能否提供其他方法?谢谢。 - Suresh
谢谢MAKKAM。它工作了,但不是我想要的方式。xy位置的结果是:[0] -> [0] -> {X =10, Y=20}; [1] -> [1] -> {X=10;Y-20};等等。字典的结果是:[0] -> 键 ->{X =10, Y=20}和值[0] -> 0; [1] -> 键 -> {X=10, Y =20} & 值[0] ->1。 它没有将相同的点与许多行索引分组。 - Suresh
@Suresh,我只是举了一个xyLocation行的例子。我不知道你是如何得到它的。我建议xyLocation是有效的List<Point>对象。你只需要检查一下字典初始化就可以了。 - default locale
@Suresh,实际上是什么意思?请确保此类实现IEqualityComparer接口。否则,GroupBy将不知道如何比较和分组您的点。另一种选择是创建自己的比较器并将其传递给该方法。在MSDN上检查GroupBy。 - default locale
我只是C#的初学者,不知道如何表达我的问题。我将使用传统循环来对其进行分组。 for (int i = 0; i < totalpts; ) { Point d = xyLocations[i].Single(); List<int> groupZ = new List<int>(); int ns = xyLocations.Count(n => n.Single() == d); for (int count = i; count < i + ns; count++) { groupZ.Add(count); } setofvalues.Add(d, groupZ); i += ns; } - Suresh
@Suresh,上面的代码对我有效。如果它对你无效,那么你应该考虑创建SSCCE(请参阅http://sscce.org/)。只包括Point类实现、常量列表初始化、字典初始化、期望和实际结果。现在,几乎不可能理解问题所在。 - default locale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接