基于列表C#

时间:2017-12-31 10:43:02

标签: c# list select distinct

我有一个字符串列表:

"55002",
"81512",
"81612",
"84515",
"84615",
"86358",
"86358",
"91128",
"94002"

我想在该列表中找到具有相同的2个第一个字符和相同的最后一个字符的项目,然后从列表中删除具有较低中间字符的项目。在此示例中,相同的是:8151281612,我想删除81512,同样是8451584615,我想删除84515等。

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

var g = new string[] {"55002",  ...};

var t=g.GroupBy(f => f.Substring(0, 2))
       .Select(f =>f.OrderByDescending(a =>a ).First());

结果:

55002 
91128 
81612 
84615 
86358 
94002 

更新:

我可能错过了那个群组也应该是最后两个角色。

如果情况如此:

var t=g.GroupBy(f => f.Substring(0, 2)+f.Substring( f.Length-2))
       .Select(f =>f.OrderByDescending(a =>a ).First());

可视化:

查看此代码:

    var g = new string[] {"55002",
"91128",
"81512",
"81712",
"81612",
"84516",
"84216",
"84615",
"86358",
"86358",
"94002"};

    var t = g.GroupBy(f => f.Substring(0, 2) + f.Substring(f.Length - 2)).Select(f => new { key = f.Key, group = f.OrderByDescending(a => a)});
    Console.Write(t);

我们要通过"键"进行分组。并在每个正确的组中取第一个:

enter image description here

答案 1 :(得分:0)

你可以这样做:

var input = new []{ "1234", "2345" /*...*/};
var res = input.GroupBy(x=> x.Substring(0,2)).Select(x=> x.OrderByDescending(y=>y).ToList()).ToList();
foreach(var l in res)
{
    l.RemoveAt(l.Count-1);
}

这将删除文字顺序中的最后一个字符串,但它将涵盖您的情况