使用 LINQ 重构过滤列表

发布于 2024-10-30 15:25:47 字数 4143 浏览 3 评论 0原文

我使用了几个类似对象的列表。任何对象都有一个 List 属性。基本上,我需要比较几个列表。

我本以为 LINQ 将是执行此操作的理想方法,但在尝试连接、扩展方法、使用收益等之后,我仍然遇到麻烦。

对于使用 LINQ 重构我的代码有什么建议吗?

更新:我正在重构 ContieneServidor (ContainsServer 翻译)方法

 private static bool ContieneServidorRefactoring(List<GrupoServidorDto> datosGruposServidores, string nombreMaquina)
    {
            var total = datosGruposServidores
                 .SelectMany(g => g.Servidores)
                 .Where(x => x.Nombre.Equals(nombreMaquina)).Count();
            if (total > 0) return true;
            return false;
    }

我的代码:

var datosGruposServidores = new List<GrupoServidorDto>();    
var gruposCompletos = new List<GrupoServidorSeleccionado>();
var maquinasSeleccionadas = new List<string>();
...

// Comprobación de Máquinas
var maquinasNoEncontradas = new List<string>();
foreach (var g in gruposCompletos)
{
    foreach (var server in g.Servidores)
    {
        var encontrado = 
            ContieneServidor(datosGruposServidores, server.Nombre);
        if (!encontrado) maquinasNoEncontradas.Add(server.Nombre);
    }
}

foreach (var m in maquinasSeleccionadas)
{
    var encontrado = ContieneServidor(datosGruposServidores, m);
    if (!encontrado) maquinasNoEncontradas.Add(m);
}

if (maquinasNoEncontradas.Count > 0)
{
    var sb = new StringBuilder();
    var sep = "";
    foreach (var maq in maquinasNoEncontradas)
    {
        sb.Append(sep + maq);
        sep = ", ";
    }

    System.Diagnostics.Trace.WriteLine("Máquinas no encontradas: " + sb.ToString());
    throw new InvalidOperationException("Máquinas no encontradas: " + sb.ToString());
}

}

private static bool ContieneServidor(
    List<GrupoServidorDto> datosGruposServidores, string nombreMaquina)
{
    foreach (var g in datosGruposServidores)
    {
        var servidor = g.Servidores.Where(s => s.Nombre.Equals(nombreMaquina));
        if (servidor != null && servidor.Count() > 0) return true;
    }
    return false;
}

private static bool ContieneServidorRefactoring(List<GrupoServidorDto> datosGruposServidores, string nombreMaquina)
{
        var total = datosGruposServidores
             .SelectMany(g => g.Servidores)
             .Where(x => x.Nombre.Equals(nombreMaquina)).Count();
        if (total > 0) return true;
        return false;
}

类型:

public class GrupoServidorDto
{
    public int IdGrupo { get; set; }

    public string Nombre { get; set; }

    private List<ServidorDto> servidores = new List<ServidorDto>();

    public List<ServidorDto> Servidores
    {
        get { return servidores; }
        set { servidores = value; }
    }
}


public class ServidorDto
{
    public int Id { get; set; }

    public string Nombre { get; set; }

    public string IP { get; set; }

    public string Entorno { get; set; }

    public string Habilitado { get; set; }

    public string Tipo { get; set; }

    public int IdGrupo { get; set; }
}


[Serializable()]
public class GrupoServidorSeleccionado
{
    [XmlAttribute()]
    public int IdGrupo { get; set; }

    [XmlAttribute()]
    public string Nombre { get; set; }

    private List<ServidorSeleccionado> servidores = 
        new List<ServidorSeleccionado>();

    [XmlElement()]
    public List<ServidorSeleccionado> Servidores
    {
        get { return servidores; }
        set { servidores = value; }
    }

    [XmlAttribute()]
    public bool EstanTodasLasMaquinasSeleccionadas { get; set; }

    public GrupoServidorSeleccionado() { }
}


[Serializable()]
public class ServidorSeleccionado
{
    [XmlAttribute()]
    public int Id { get; set; }

    [XmlAttribute()]
    public string Nombre { get; set; }

    [XmlAttribute()]
    public string IP { get; set; }

    [XmlAttribute()]
    public string Entorno { get; set; }

    [XmlAttribute()] // [XmlIgnore()]
    public string Habilitado { get; set; }

    [XmlAttribute()]
    public string Tipo { get; set; }

    [XmlAttribute()]
    public int IdGrupo { get; set; }
}

I use several lists of similar objects. Anyone object has a List property. Basically, I need compare several lists.

I would have thought that LINQ would be an ideal way of doing this but after trying joins, extension methods, using yields, etc. I'm still having trouble.

any suggestions for refactor my code to using LINQ ?

Update: I'm refactor ContieneServidor (ContainsServer translate) method

 private static bool ContieneServidorRefactoring(List<GrupoServidorDto> datosGruposServidores, string nombreMaquina)
    {
            var total = datosGruposServidores
                 .SelectMany(g => g.Servidores)
                 .Where(x => x.Nombre.Equals(nombreMaquina)).Count();
            if (total > 0) return true;
            return false;
    }

My code:

var datosGruposServidores = new List<GrupoServidorDto>();    
var gruposCompletos = new List<GrupoServidorSeleccionado>();
var maquinasSeleccionadas = new List<string>();
...

// Comprobación de Máquinas
var maquinasNoEncontradas = new List<string>();
foreach (var g in gruposCompletos)
{
    foreach (var server in g.Servidores)
    {
        var encontrado = 
            ContieneServidor(datosGruposServidores, server.Nombre);
        if (!encontrado) maquinasNoEncontradas.Add(server.Nombre);
    }
}

foreach (var m in maquinasSeleccionadas)
{
    var encontrado = ContieneServidor(datosGruposServidores, m);
    if (!encontrado) maquinasNoEncontradas.Add(m);
}

if (maquinasNoEncontradas.Count > 0)
{
    var sb = new StringBuilder();
    var sep = "";
    foreach (var maq in maquinasNoEncontradas)
    {
        sb.Append(sep + maq);
        sep = ", ";
    }

    System.Diagnostics.Trace.WriteLine("Máquinas no encontradas: " + sb.ToString());
    throw new InvalidOperationException("Máquinas no encontradas: " + sb.ToString());
}

}

private static bool ContieneServidor(
    List<GrupoServidorDto> datosGruposServidores, string nombreMaquina)
{
    foreach (var g in datosGruposServidores)
    {
        var servidor = g.Servidores.Where(s => s.Nombre.Equals(nombreMaquina));
        if (servidor != null && servidor.Count() > 0) return true;
    }
    return false;
}

private static bool ContieneServidorRefactoring(List<GrupoServidorDto> datosGruposServidores, string nombreMaquina)
{
        var total = datosGruposServidores
             .SelectMany(g => g.Servidores)
             .Where(x => x.Nombre.Equals(nombreMaquina)).Count();
        if (total > 0) return true;
        return false;
}

The types:

public class GrupoServidorDto
{
    public int IdGrupo { get; set; }

    public string Nombre { get; set; }

    private List<ServidorDto> servidores = new List<ServidorDto>();

    public List<ServidorDto> Servidores
    {
        get { return servidores; }
        set { servidores = value; }
    }
}


public class ServidorDto
{
    public int Id { get; set; }

    public string Nombre { get; set; }

    public string IP { get; set; }

    public string Entorno { get; set; }

    public string Habilitado { get; set; }

    public string Tipo { get; set; }

    public int IdGrupo { get; set; }
}


[Serializable()]
public class GrupoServidorSeleccionado
{
    [XmlAttribute()]
    public int IdGrupo { get; set; }

    [XmlAttribute()]
    public string Nombre { get; set; }

    private List<ServidorSeleccionado> servidores = 
        new List<ServidorSeleccionado>();

    [XmlElement()]
    public List<ServidorSeleccionado> Servidores
    {
        get { return servidores; }
        set { servidores = value; }
    }

    [XmlAttribute()]
    public bool EstanTodasLasMaquinasSeleccionadas { get; set; }

    public GrupoServidorSeleccionado() { }
}


[Serializable()]
public class ServidorSeleccionado
{
    [XmlAttribute()]
    public int Id { get; set; }

    [XmlAttribute()]
    public string Nombre { get; set; }

    [XmlAttribute()]
    public string IP { get; set; }

    [XmlAttribute()]
    public string Entorno { get; set; }

    [XmlAttribute()] // [XmlIgnore()]
    public string Habilitado { get; set; }

    [XmlAttribute()]
    public string Tipo { get; set; }

    [XmlAttribute()]
    public int IdGrupo { get; set; }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

对你的占有欲 2024-11-06 15:25:48

认为你想要:

var maquinasNoEncontradas = gruposCompletos
                   .SelectMany(g => g.Servidores)
                   .Select(x => x.Nombre)
                   .Concat(maquinasSeleccionadas)
                   .Where(x => !ContieneServidor(datosGruposServidores, x))
                   .ToList();

然后:

if (maquinasNoEncontradas.Count > 0)
{
    // This assumes .NET 4; it's *slightly* more awkward in .NET 3.5, but
    // still simpler than doing it by hand.
    string text = string.Join(", ", maquinasNoEncontradas);

    System.Diagnostics.Trace.WriteLine("Máquinas no encontradas: " + text);
    throw new InvalidOperationException("Máquinas no encontradas: " + text);
}

可以潜在地构建逗号分隔的版本,然后测试那是否是一个空字符串......但是老实说,我不确定我会不会。

I think you want:

var maquinasNoEncontradas = gruposCompletos
                   .SelectMany(g => g.Servidores)
                   .Select(x => x.Nombre)
                   .Concat(maquinasSeleccionadas)
                   .Where(x => !ContieneServidor(datosGruposServidores, x))
                   .ToList();

And then:

if (maquinasNoEncontradas.Count > 0)
{
    // This assumes .NET 4; it's *slightly* more awkward in .NET 3.5, but
    // still simpler than doing it by hand.
    string text = string.Join(", ", maquinasNoEncontradas);

    System.Diagnostics.Trace.WriteLine("Máquinas no encontradas: " + text);
    throw new InvalidOperationException("Máquinas no encontradas: " + text);
}

You could potentially build the comma-separated version and then test whether that's an empty string... but I'm not sure I would, to be honest.

紫瑟鸿黎 2024-11-06 15:25:48
        string.Join(", ", gruposCompletos
                              .SelectMany(x => x.Servidores)
                              .Select(x => x.Nombre)
                              .Concat(maquinasSeleccionadas)
                              .Where(x => !ContieneServidor(datosGruposServidores, x))
                              .ToArray());
        string.Join(", ", gruposCompletos
                              .SelectMany(x => x.Servidores)
                              .Select(x => x.Nombre)
                              .Concat(maquinasSeleccionadas)
                              .Where(x => !ContieneServidor(datosGruposServidores, x))
                              .ToArray());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文