如何解决C# 迭代特定值的列表,然后按特定顺序将它们添加到另一个列表
我的程序中某些列表的每个实例的顺序是任意不同的(由于 Umbraco CMS 表单中的一个未修复的错误),我需要将它们重新排列为正确的顺序。我不能使用索引和 OrderBy
,因为每次顺序不同。
我一直在尝试迭代现有列表,然后,当它找到应该位于 [0] 位置的正确字符串时,使用 .Add
将其添加到另一个空列表中。然后继续将每个值添加到正确的索引中。
我想不出办法做到这一点。我需要的逻辑基本上是说“查看这个列表,如果字符串等于这个值,将它添加到位置 0 的另一个列表,然后查找下一个字符串添加到位置 1,依此类推”,所以在最后,我将按照正确的顺序获得新列表。
// List to populate from record in wrong order
var extractedFields = new List<KeyValuePair<string,string>>();
// new list to copy values across in correct order
var newOrderFields = new List<KeyValuePair<string,string>>();
// separate list containing data field captions,used to iterate later
var extractedCaptions = new List<string>();
foreach (var field in record.RecordFields)
{
var extractValue = field.Value.ValuesAsString().NullSafeToString();
var extractType = CGHelper.CleanString(field.Value.Field.FieldType.Name).ToLower();
var extractCaption = field.Value.Field.Caption;
extractedFields.Add(new KeyValuePair<string,string>(extractType,extractValue));
extractedCaptions.Add(extractCaption);
}
var count = 0;
foreach (var cap in extractedCaptions.ToList())
{
if (cap == "Opportunity ID")
{
extractedCaptions.Remove(cap);
extractedCaptions.Insert(0,cap);
var key = extractedFields[count].Key;
var value = extractedFields[count].Value;
newOrderFields.Add(new KeyValuePair<string,string>(key,value));
}
else if (cap == "Name")
{
// etc. identify string to be put into correct order
为了进一步解释,用户提交了一个表单,其中的字段按特定顺序排列。当我们加载该表单并通过(从 Umbraco 表单)拉出记录时,它的顺序完全不同且任意(并且每个表单的顺序都不同)。因此我需要迭代字段并将它们放回原处进入它们在原始形式中的顺序...
解决方法
我不知道我是否正确理解了情况。但是您可以利用 IComparer<T>
接口自定义排序逻辑。
using System;
using System.Collections.Generic;
namespace Comparer
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var list = new[]{"Foobar","Baz","Foo","Foobar","Bar",};
Array.Sort(list,new CustomComparer(new[]{"Foo","Foobar"}));
list.Dump();
// will dump : Foo,Bar,Baz,Foobar,Foobar
}
}
public class CustomComparer : IComparer<string>
{
private readonly string[] priorityList;
public CustomComparer(string[] priorityList)
{
this.priorityList = priorityList;
}
public int Compare(string x,string y)
{
var xIx = Array.IndexOf(priorityList,x);
var yIx = Array.IndexOf(priorityList,y);
return xIx.CompareTo(yIx);
}
}
}
这将根据构造函数中证明的索引对数组进行排序。
,我写了一个小例子。 您可以看到它在运行 here。
这个想法是迭代有序列表并搜索其他列表中的每个值。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
List<string> ordered = new List<string>(){ "a","b","c","d"};
List<string> nonOrderedAndMissing = new List<string>(){ "c","d","a"};
// here is the join
var newList = ordered.Select(a => nonOrderedAndMissing.Contains(a) ? a : null).Where(d => d != null).ToList();
// checking here
foreach(var a in newList){
Console.WriteLine(a);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。