如何比较2个按字符列出的内容及其通讯员的双倍值?

时间:2013-05-15 01:25:45

标签: c# linq list

我有2个列表:一个字符串列表和一个长度相同且具有相同索引索引的双列表。我需要比较所有字符串,找到具有相同字符的列表的索引,与其顺序无关,并删除与两者相对应的最高double值,

示例:

List<string> str= new List<string>();
str.add("efc");
str.add("abc");
str.add("cde");
str.add("cab");
str.add("fbc");

List<double> vlr= new List<double>();
vlr.add(0.1);
vlr.add(0.5);
vlr.add(0.4);
vlr.add(0.2);
vlr.add(0.3);

和这种情况,“abc”=&gt; (0.5)必须删除,因为“cab”具有相同的字符且较低的对应值=&gt;(0.2)。

这个2个数组有一个lambda表达式吗?

我尝试了什么:

var distinct = list .Select((str, idx) => new { Str = str, Idx = idx }) 
.GroupBy(pair => new HashSet<char>(pair.Str), HashSet<char>.CreateSetComparer()) 
.Select(grp => grp.OrderBy(p => p.Idx).First()) 
.ToList();

3 个答案:

答案 0 :(得分:1)

var newDict = str.Zip(vlr, (s, d) => new { s, d })
                .GroupBy(x => String.Join("", x.s.OrderBy(y => y)))
                .Select(g => g.OrderBy(x => x.d).First())
                .ToDictionary(x => x.s, x => x.d);

答案 1 :(得分:1)

这是解决问题的一种方法:

// Pair the strings with their correspondence values
var pairs = str.Zip(vlr, (s, d) => new {s, d});

// Group using a sorted string, eliminating differences due to character order
var groups = pairs.GroupBy(x => new string(x.s.ToCharArray().OrderBy(c => c).ToArray()));

// For each group, retain the item with the lowest correspondence value 
var filtered = groups.Select(x => x.OrderBy(y => y.d).First().s);

答案 2 :(得分:0)

这是代码:

    var group = str.GroupBy(s => string.Join("", s.ToCharArray().OrderBy(c => c)));
    var _vlr = group.Select(g => g.Min(s => vlr[str.IndexOf(s)]));
    var _str = group.Select(g => g.OrderBy(s => vlr[str.IndexOf(s)]).First());

结果: enter image description here