首页 > 解决方案 > 从列表中删除对象

问题描述

我有以下清单-

public class edgeData
{
    public string source { get; set; }
    public string target { get; set; }
}

var edgeList = new List<edgeData>();
var linkCount = 1;

我想edgeDataedgeList集体出现小于或等于linkCount.

例如建立我的 edgeData -

var newEdge = new edgeData();
newEdge.source = "James";
newEdge.target = 1;
edgeList.Add(newEdge);

var newEdge = new edgeData();
newEdge.source = "Greg";
newEdge.target = 2;
edgeList.Add(newEdge);

var newEdge = new edgeData();
newEdge.source = "James";
newEdge.target = 3;
edgeList.Add(newEdge);

然后处理删除出现小于或等于的条目linkCount-

public List<edgeData> RemoveLinks(List<edgeData>() edgeList, int linkCount)
{
    var updatedEdgeData = new List<edgeData>();

    // logic

    return updatedEdgeData;
}

因此,在示例中,包含“Greg”作为源的条目将被删除,因为他只出现过一次,等于 linkCount。

我尝试使用 for 循环执行此操作,但这很快就变得非常难看,并且相信 Linq 是最好的选择,但是我该如何实现呢?

标签: c#listlinq

解决方案


您可以执行以下操作

edgeList.GroupBy(x=>x.source)
                   .Where(x=>x.Count()>linkCount)
                   .SelectMany(x=>x)
                   .ToList();

您需要Group按来源过滤掉项目少于linkCount.

另请注意,根据 OP,edgeData.target是一个字符串,但您的代码将其显示为数字。希望这是一个错字。

更新

正如 Harald 指出的那样,如果组的大小很大,您可以选择使用,

edgeList.GroupBy(x=>x.source)
                   .Where(x=>x.Skip(linkCount).Any())
                   .SelectMany(x=>x)
                   .ToList()

推荐阅读