如何在列表列表c#LINQ中获取具有相同值的所有项目?

时间:2017-06-26 11:57:55

标签: linq c#-4.0

我要在已经实现的代码中添加特定要求。 数据结构就是这样的:

public class Module
{
    public string Type;
    public string ID;
    public List<Point> Points = new List<Point>();
 }

public class Point
{
    public string Type;
    public string Location;
    public string Connection;
}

最初LINQ用于返回具有某些特征的所有模块

List<Module> miList = Modules.Where(m => m.Type != null 
                             && m.ID == "A" 
                             && m.Points.Where(t => t.Connection == "" 
                                && SimilarPoint(t.Type, x).ToList())
                             .Count() > 0)
                             .ToList();

用x输入函数。新要求规定返回的模块都应具有Connection等于“”的点和位置字段中的相同值。

在我看来,SelectMany可以用于此目的,但我没有达到我的预期。

如何修改上述功能?

提前致谢

2 个答案:

答案 0 :(得分:0)

不完全确定SimilarPoint(t.Type, x)在这里做了什么。
也许你应该尝试这样的事情,看看它是否适合你 -

var resultSet = Modules.Where(m => !string.IsNullOrEmpty(m.Type) && m.ID.Equals("A"))
                .Select(n => 
                    new Module {
                        Type=n.Type,
                        ID=n.ID,
                        Points= n.Points.Where(p => String.IsNullOrEmpty(p.Connection) && String.IsNullOrEmpty(p.Location)).ToList()
                    })
                .ToList(); 

答案 1 :(得分:0)

你说所有返回的模块都有相同的Location,但是这并没有解释你如何选择Location所以我随意挑选了第一个匹配模块的位置:< / p>

var miQuery1 = Modules.Where(m => m.Type != null
                             && m.ID == "A"
                             && m.Points.Where(t => t.Connection == ""
                                && SimilarPoint(t.Type, x).ToList()).Count() > 0)
                        .Where(m => m.Points.All(p => p.Connection == ""));
var miQuery2 = miQuery1.Where(m => m.Location == miQuery1.First().Location);
List<Module> miList = miQuery2.ToList();